zebra_chain/serialization/
constraint.rs1use bounded_vec::BoundedVec;
4
5pub type AtLeastOne<T> = BoundedVec<T, 1, { usize::MAX }>;
13
14#[cfg(any(test, feature = "proptest-impl"))]
24#[macro_export]
25macro_rules! at_least_one {
26 ($element:expr; 0) => (
27 compile_error!("At least one element needed to create an `AtLeastOne<T>`")
28 );
29
30 ($element:expr; $count:expr) => (
31 {
32 <Vec<_> as std::convert::TryInto<$crate::serialization::AtLeastOne<_>>>::try_into(
33 vec![$element; $count],
34 ).expect("at least one element in `AtLeastOne<_>`")
35 }
36 );
37
38 ($($element:expr),+ $(,)?) => (
39 {
40 <Vec<_> as std::convert::TryInto<$crate::serialization::AtLeastOne<_>>>::try_into(
41 vec![$($element),*],
42 ).expect("at least one element in `AtLeastOne<_>`")
43 }
44 );
45}
46
47#[cfg(test)]
48mod tests {
49 use super::AtLeastOne;
50
51 #[test]
52 fn at_least_one_count_form_works() {
53 let v: AtLeastOne<i32> = at_least_one![42; 1];
54 assert_eq!(v.as_slice(), [42]);
55
56 let v2: AtLeastOne<u8> = at_least_one![5; 2];
57 assert_eq!(v2.as_slice(), [5, 5]);
58 }
59}