Skip to main content

casper_contract_sdk/collections/
set.rs

1use crate::prelude::marker::PhantomData;
2
3use crate::{casper, serializers::borsh::BorshSerialize};
4use casper_executor_wasm_common::keyspace::Keyspace;
5
6use super::lookup_key::{Identity, LookupKey, LookupKeyOwned};
7
8#[derive(Clone)]
9pub struct Set<T, L = Identity>
10where
11    T: BorshSerialize,
12{
13    prefix: String,
14    lookup: L,
15    _marker: PhantomData<T>,
16}
17
18impl<T, L> Set<T, L>
19where
20    T: BorshSerialize,
21    L: LookupKeyOwned,
22    for<'a> <L as LookupKey<'a>>::Output: AsRef<[u8]>,
23{
24    pub fn new(prefix: String) -> Self {
25        Self {
26            prefix,
27            lookup: L::default(),
28            _marker: PhantomData,
29        }
30    }
31
32    pub fn insert(&mut self, key: T) {
33        let lookup_key = self.lookup.lookup(self.prefix.as_bytes(), &key);
34        casper::write(Keyspace::Context(lookup_key.as_ref()), &[]).unwrap();
35    }
36
37    pub fn contains_key(&self, key: T) -> bool {
38        let lookup_key = self.lookup.lookup(self.prefix.as_bytes(), &key);
39        let entry = casper::read(Keyspace::Context(lookup_key.as_ref()), |_size| None).unwrap();
40        entry.is_some()
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use crate::prelude::*;
47
48    use crate::serializers::borsh::BorshSerialize;
49
50    use super::Set;
51
52    #[derive(BorshSerialize)]
53    #[borsh(crate = "crate::serializers::borsh")]
54    pub enum Flag {
55        A,
56        B,
57        C,
58    }
59
60    #[ignore]
61    #[test]
62    fn should_insert() {
63        let mut set: Set<Flag> = Set::new("Prefix".to_string());
64
65        assert!(!set.contains_key(Flag::A));
66        assert!(!set.contains_key(Flag::B));
67        assert!(!set.contains_key(Flag::C));
68
69        set.insert(Flag::A);
70        assert!(set.contains_key(Flag::A));
71
72        set.insert(Flag::B);
73        assert!(set.contains_key(Flag::B));
74
75        set.insert(Flag::C);
76        assert!(set.contains_key(Flag::C));
77    }
78}