Skip to main content

osdp/
payload_util.rs

1//! Internal helpers for per-message encode/decode bodies. Centralizes the
2//! length validations that every payload module would otherwise duplicate.
3
4use crate::error::Error;
5
6/// Reject any payload whose length is not exactly `expected`.
7#[inline]
8pub(crate) fn require_exact_len(data: &[u8], expected: usize, code: u8) -> Result<(), Error> {
9    if data.len() != expected {
10        return Err(Error::PayloadLength {
11            code,
12            expected,
13            got: data.len(),
14        });
15    }
16    Ok(())
17}
18
19/// Reject any payload shorter than `min` (used when a header has variable-
20/// length tail and we need at least `min` bytes to parse the fixed prefix).
21#[inline]
22pub(crate) fn require_at_least(data: &[u8], min: usize, code: u8) -> Result<(), Error> {
23    if data.len() < min {
24        return Err(Error::PayloadTooShort {
25            code,
26            min,
27            got: data.len(),
28        });
29    }
30    Ok(())
31}
32
33/// Reject empty payloads or those whose length is not a multiple of `block`.
34/// Used by record-array commands like `osdp_OUT` and `osdp_LED` where each
35/// record is a fixed `block` bytes wide.
36#[inline]
37pub(crate) fn require_positive_multiple_of(
38    data: &[u8],
39    block: usize,
40    code: u8,
41) -> Result<(), Error> {
42    if data.is_empty() || data.len() % block != 0 {
43        return Err(Error::PayloadNotMultiple {
44            code,
45            block,
46            got: data.len(),
47        });
48    }
49    Ok(())
50}
51
52/// Reject payloads whose length is not a multiple of `block`. Empty payloads
53/// pass — used by lists like `osdp_PDCAP` where zero records is meaningful.
54#[inline]
55pub(crate) fn require_multiple_of(data: &[u8], block: usize, code: u8) -> Result<(), Error> {
56    if data.len() % block != 0 {
57        return Err(Error::PayloadNotMultiple {
58            code,
59            block,
60            got: data.len(),
61        });
62    }
63    Ok(())
64}