casper_storage/data_access_layer/
trie.rs

1use casper_types::Digest;
2
3use crate::global_state::{error::Error as GlobalStateError, trie::TrieRaw};
4
5/// Request for a trie element.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub struct TrieRequest {
8    trie_key: Digest,
9    chunk_id: Option<u64>,
10}
11
12impl TrieRequest {
13    /// Creates an instance of TrieRequest.
14    pub fn new(trie_key: Digest, chunk_id: Option<u64>) -> Self {
15        TrieRequest { trie_key, chunk_id }
16    }
17
18    /// Trie key.
19    pub fn trie_key(&self) -> Digest {
20        self.trie_key
21    }
22
23    /// Chunk id.
24    pub fn chunk_id(&self) -> Option<u64> {
25        self.chunk_id
26    }
27
28    /// Has chunk id.
29    pub fn has_chunk_id(&self) -> bool {
30        self.chunk_id.is_some()
31    }
32}
33
34/// A trie element.
35#[derive(Debug)]
36pub enum TrieElement {
37    /// Raw bytes.
38    Raw(TrieRaw),
39    /// Chunk.
40    Chunked(TrieRaw, u64),
41}
42
43/// Represents a result of a `trie` request.
44#[derive(Debug)]
45pub enum TrieResult {
46    /// Value not found.
47    ValueNotFound(String),
48    /// The trie element at the specified key.
49    Success {
50        /// A trie element.
51        element: TrieElement,
52    },
53    /// Failed to get the trie element.
54    Failure(GlobalStateError),
55}
56
57impl TrieResult {
58    /// Transform trie result to raw state.
59    pub fn into_raw(self) -> Result<Option<TrieRaw>, GlobalStateError> {
60        match self {
61            TrieResult::ValueNotFound(_) => Ok(None),
62            TrieResult::Success { element } => match element {
63                TrieElement::Raw(raw) | TrieElement::Chunked(raw, _) => Ok(Some(raw)),
64            },
65            TrieResult::Failure(err) => Err(err),
66        }
67    }
68}
69
70/// Request for a trie element to be persisted.
71#[derive(Debug, Clone, PartialEq, Eq)]
72pub struct PutTrieRequest {
73    raw: TrieRaw,
74}
75
76impl PutTrieRequest {
77    /// Creates an instance of PutTrieRequest.
78    pub fn new(raw: TrieRaw) -> Self {
79        PutTrieRequest { raw }
80    }
81
82    /// The raw bytes of the trie element.
83    pub fn raw(&self) -> &TrieRaw {
84        &self.raw
85    }
86
87    /// Take raw trie value.
88    pub fn take_raw(self) -> TrieRaw {
89        self.raw
90    }
91}
92
93/// Represents a result of a `put_trie` request.
94#[derive(Debug)]
95pub enum PutTrieResult {
96    /// The trie element is persisted.
97    Success {
98        /// The hash of the persisted trie element.
99        hash: Digest,
100    },
101    /// Failed to persist the trie element.
102    Failure(GlobalStateError),
103}
104
105impl PutTrieResult {
106    /// Returns a Result matching the original api for this functionality.
107    pub fn as_legacy(&self) -> Result<Digest, GlobalStateError> {
108        match self {
109            PutTrieResult::Success { hash } => Ok(*hash),
110            PutTrieResult::Failure(err) => Err(err.clone()),
111        }
112    }
113}