stellar_xdr/curr/
scmap.rs

1#![allow(clippy::missing_errors_doc)]
2
3use super::{Error, ScMap, ScMapEntry, ScVal, Validate};
4extern crate alloc;
5use alloc::vec::Vec;
6
7impl ScMap {
8    pub fn sorted_from_entries<I, E>(entries: I) -> Result<ScMap, Error>
9    where
10        E: TryInto<ScMapEntry>,
11        I: Iterator<Item = E>,
12    {
13        let mut v = entries
14            .map(TryInto::try_into)
15            .collect::<Result<Vec<_>, _>>()
16            .map_err(|_| Error::Invalid)?;
17        // TODO: Add tests that prove order consistency of ScVal with RawVal. https://github.com/stellar/rs-stellar-xdr/issues/117
18        v.sort_by(|a, b| a.key.cmp(&b.key));
19        let m = ScMap(v.try_into()?);
20        // `validate` will further check that there are no duplicates.
21        m.validate()?;
22        Ok(m)
23    }
24
25    pub fn sorted_from_pairs<K, V, I>(pairs: I) -> Result<ScMap, Error>
26    where
27        K: TryInto<ScVal>,
28        V: TryInto<ScVal>,
29        I: Iterator<Item = (K, V)>,
30    {
31        Self::sorted_from_entries(pairs)
32    }
33
34    pub fn sorted_from<I, E>(src: I) -> Result<ScMap, Error>
35    where
36        E: TryInto<ScMapEntry>,
37        I: IntoIterator<Item = E>,
38    {
39        Self::sorted_from_entries(src.into_iter())
40    }
41}
42
43#[cfg(test)]
44mod test {
45    use super::*;
46    use alloc::{collections::BTreeMap, vec};
47
48    #[test]
49    fn scmap_from_map() -> Result<(), ()> {
50        let mut m: BTreeMap<u32, u32> = BTreeMap::new();
51        m.insert(1, 2);
52        m.insert(5, 6);
53        m.insert(3, 4);
54        let scm = ScMap::sorted_from(m)?;
55        assert_eq!(scm.0.first().unwrap().key, 1u32.into());
56        assert_eq!(scm.0.last().unwrap().key, 5u32.into());
57        Ok(())
58    }
59
60    #[test]
61    fn scmap_from_pairs() -> Result<(), ()> {
62        let pairs: Vec<(u32, u32)> = vec![(3, 4), (5, 6), (1, 2)];
63        let scm = ScMap::sorted_from(pairs)?;
64        assert_eq!(scm.0.first().unwrap().key, 1u32.into());
65        assert_eq!(scm.0.last().unwrap().key, 5u32.into());
66        Ok(())
67    }
68
69    #[test]
70    fn scmap_from_pairs_containing_duplicate_keys() {
71        let pairs: Vec<(u32, u32)> = vec![(3, 4), (3, 5), (5, 6), (1, 2)];
72        let scm = ScMap::sorted_from(pairs);
73        assert!(scm.is_err());
74    }
75}