commonware_codec/types/
mod.rs

1//! Codec implementations for common types
2
3use crate::{Error, Read};
4use ::bytes::Buf;
5use core::cmp::Ordering;
6
7pub mod btree_map;
8pub mod btree_set;
9pub mod bytes;
10#[cfg(feature = "std")]
11pub mod hash_map;
12#[cfg(feature = "std")]
13pub mod hash_set;
14#[cfg(feature = "std")]
15pub mod net;
16pub mod primitives;
17pub mod tuple;
18pub mod vec;
19
20/// Read items from [Buf] in ascending order.
21fn read_ordered_set<K, F>(
22    buf: &mut impl Buf,
23    len: usize,
24    cfg: &K::Cfg,
25    mut insert: F,
26    set_type: &'static str,
27) -> Result<(), Error>
28where
29    K: Read + Ord,
30    F: FnMut(K) -> bool,
31{
32    let mut last: Option<K> = None;
33    for _ in 0..len {
34        // Read item
35        let item = K::read_cfg(buf, cfg)?;
36
37        // Check if items are in ascending order
38        if let Some(ref last) = last {
39            match item.cmp(last) {
40                Ordering::Equal => return Err(Error::Invalid(set_type, "Duplicate item")),
41                Ordering::Less => return Err(Error::Invalid(set_type, "Items must ascend")),
42                _ => {}
43            }
44        }
45
46        // Add previous item, if exists
47        if let Some(last) = last.take() {
48            insert(last);
49        }
50        last = Some(item);
51    }
52
53    // Add last item, if exists
54    if let Some(last) = last {
55        insert(last);
56    }
57
58    Ok(())
59}