cnidarium/
write.rs

1use crate::StateRead;
2use std::{any::Any, collections::BTreeMap};
3use tendermint::abci;
4
5/// Write access to chain state.
6pub trait StateWrite: StateRead + Send + Sync {
7    /// Puts raw bytes into the verifiable key-value store with the given key.
8    fn put_raw(&mut self, key: String, value: Vec<u8>);
9
10    /// Delete a key from the verifiable key-value store.
11    fn delete(&mut self, key: String);
12
13    /// Puts raw bytes into the non-verifiable key-value store with the given key.
14    fn nonverifiable_put_raw(&mut self, key: Vec<u8>, value: Vec<u8>);
15
16    /// Delete a key from non-verifiable key-value storage.
17    fn nonverifiable_delete(&mut self, key: Vec<u8>);
18
19    /// Puts an object into the ephemeral object store with the given key.
20    ///
21    /// # Panics
22    ///
23    /// If the object is already present in the store, but its type is not the same as the type of
24    /// `value`.
25    fn object_put<T: Clone + Any + Send + Sync>(&mut self, key: &'static str, value: T);
26
27    /// Deletes a key from the ephemeral object store.
28    fn object_delete(&mut self, key: &'static str);
29
30    /// Merge a set of object changes into this `StateWrite`.
31    ///
32    /// Unlike `object_put`, this avoids re-boxing values and messing up the downcasting.
33    fn object_merge(&mut self, objects: BTreeMap<&'static str, Option<Box<dyn Any + Send + Sync>>>);
34
35    /// Record that an ABCI event occurred while building up this set of state changes.
36    fn record(&mut self, event: abci::Event);
37}
38
39impl<'a, S: StateWrite + Send + Sync> StateWrite for &'a mut S {
40    fn put_raw(&mut self, key: String, value: jmt::OwnedValue) {
41        (**self).put_raw(key, value)
42    }
43
44    fn delete(&mut self, key: String) {
45        (**self).delete(key)
46    }
47
48    fn nonverifiable_delete(&mut self, key: Vec<u8>) {
49        (**self).nonverifiable_delete(key)
50    }
51
52    fn nonverifiable_put_raw(&mut self, key: Vec<u8>, value: Vec<u8>) {
53        (**self).nonverifiable_put_raw(key, value)
54    }
55
56    fn object_put<T: Clone + Any + Send + Sync>(&mut self, key: &'static str, value: T) {
57        (**self).object_put(key, value)
58    }
59
60    fn object_delete(&mut self, key: &'static str) {
61        (**self).object_delete(key)
62    }
63
64    fn object_merge(
65        &mut self,
66        objects: BTreeMap<&'static str, Option<Box<dyn Any + Send + Sync>>>,
67    ) {
68        (**self).object_merge(objects)
69    }
70
71    fn record(&mut self, event: abci::Event) {
72        (**self).record(event)
73    }
74}