casper_executor_wasm_common/
keyspace.rs

1use num_derive::{FromPrimitive, ToPrimitive};
2
3#[repr(u64)]
4#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
5pub enum KeyspaceTag {
6    /// Used for a state based storage which usually involves single dimensional data i.e.
7    /// key-value pairs, etc.
8    ///
9    /// See also [`Keyspace::State`].
10    State = 0,
11    /// Used for a context based storage which usually involves multi dimensional data i.e. maps,
12    /// efficient vectors, etc.
13    Context = 1,
14    /// Used for a named key based storage which usually involves named keys.
15    NamedKey = 2,
16    /// Used for a payment info based storage which usually involves payment information.
17    PaymentInfo = 3,
18}
19
20#[repr(u64)]
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22pub enum Keyspace<'a> {
23    /// Stores contract's context.
24    ///
25    /// There's no additional payload for this variant as the host implies the contract's address.
26    State,
27    /// Stores contract's context date. Bytes can be any value as long as it uniquely identifies a
28    /// value.
29    Context(&'a [u8]),
30    /// Stores contract's named keys.
31    NamedKey(&'a str),
32    /// Entry point payment info.
33    PaymentInfo(&'a str),
34}
35
36impl Keyspace<'_> {
37    #[must_use]
38    pub fn as_tag(&self) -> KeyspaceTag {
39        match self {
40            Keyspace::State => KeyspaceTag::State,
41            Keyspace::Context(_) => KeyspaceTag::Context,
42            Keyspace::NamedKey(_) => KeyspaceTag::NamedKey,
43            Keyspace::PaymentInfo(_) => KeyspaceTag::PaymentInfo,
44        }
45    }
46
47    #[must_use]
48    pub fn as_u64(&self) -> u64 {
49        self.as_tag() as u64
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn test_as_tag_state() {
59        let keyspace = Keyspace::State;
60        assert_eq!(keyspace.as_tag(), KeyspaceTag::State);
61    }
62
63    #[test]
64    fn test_as_tag_context() {
65        let data = [1, 2, 3];
66        let keyspace = Keyspace::Context(&data);
67        assert_eq!(keyspace.as_tag(), KeyspaceTag::Context);
68    }
69
70    #[test]
71    fn test_as_tag_named_key() {
72        let name = "my_key";
73        let keyspace = Keyspace::NamedKey(name);
74        assert_eq!(keyspace.as_tag(), KeyspaceTag::NamedKey);
75    }
76
77    #[test]
78    fn test_as_u64_state() {
79        let keyspace = Keyspace::State;
80        assert_eq!(keyspace.as_u64(), 0);
81    }
82
83    #[test]
84    fn test_as_u64_context() {
85        let data = [1, 2, 3];
86        let keyspace = Keyspace::Context(&data);
87        assert_eq!(keyspace.as_u64(), 1);
88    }
89
90    #[test]
91    fn test_as_u64_named_key() {
92        let name = "my_key";
93        let keyspace = Keyspace::NamedKey(name);
94        assert_eq!(keyspace.as_u64(), 2);
95    }
96
97    #[test]
98    fn test_as_u64_payment_info() {
99        let name = "entry_point";
100        let keyspace: Keyspace = Keyspace::PaymentInfo(name);
101        assert_eq!(keyspace.as_u64(), 3);
102    }
103}