garde/rules/length/
bytes.rs1use crate::error::Error;
6
7pub fn apply<T: Bytes>(v: &T, (min, max): (usize, usize)) -> Result<(), Error> {
8 v.validate_num_bytes(min, max)
9}
10
11pub trait Bytes {
12 fn validate_num_bytes(&self, min: usize, max: usize) -> Result<(), Error>;
13}
14
15impl<T: HasBytes> Bytes for T {
16 fn validate_num_bytes(&self, min: usize, max: usize) -> Result<(), Error> {
17 super::check_len(self.num_bytes(), min, max)
18 }
19}
20
21impl<T: Bytes> Bytes for Option<T> {
22 fn validate_num_bytes(&self, min: usize, max: usize) -> Result<(), Error> {
23 match self {
24 Some(v) => v.validate_num_bytes(min, max),
25 None => Ok(()),
26 }
27 }
28}
29
30pub trait HasBytes {
31 fn num_bytes(&self) -> usize;
32}
33
34macro_rules! impl_via_len {
35 ($(in<$lifetime:lifetime>)? $T:ty) => {
36 impl<$($lifetime)?> HasBytes for $T {
37 fn num_bytes(&self) -> usize {
38 self.len()
39 }
40 }
41 };
42}
43
44impl_via_len!(std::string::String);
45impl_via_len!(in<'a> &'a std::string::String);
46impl_via_len!(in<'a> &'a str);
47impl_via_len!(in<'a> std::borrow::Cow<'a, str>);
48impl_via_len!(std::rc::Rc<str>);
49impl_via_len!(std::sync::Arc<str>);
50impl_via_len!(std::boxed::Box<str>);
51impl_via_len!(in<'a> &'a [u8]);
52impl_via_len!(std::rc::Rc<[u8]>);
53impl_via_len!(std::sync::Arc<[u8]>);
54impl_via_len!(std::boxed::Box<[u8]>);
55impl_via_len!(std::vec::Vec<u8>);
56
57impl<const N: usize> HasBytes for [u8; N] {
58 fn num_bytes(&self) -> usize {
59 self.len()
60 }
61}