casper_contract_sdk/collections/
set.rs1use 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}