stellar_xdr/next/
scmap.rs1#![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 v.sort_by(|a, b| a.key.cmp(&b.key));
19 let m = ScMap(v.try_into()?);
20 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}