gear_common/
code_storage.rs1use super::*;
20use crate::storage::MapStorage;
21use gear_core::code::{CodeAndId, InstrumentedCode, InstrumentedCodeAndId};
22
23#[derive(Clone, Copy, Debug)]
24pub enum Error {
25 DuplicateItem,
27}
28
29pub trait CodeStorage {
31 type InstrumentedCodeStorage: MapStorage<Key = CodeId, Value = InstrumentedCode>;
32 type InstrumentedLenStorage: MapStorage<Key = CodeId, Value = u32>;
33 type OriginalCodeStorage: MapStorage<Key = CodeId, Value = Vec<u8>>;
34 type MetadataStorage: MapStorage<Key = CodeId, Value = CodeMetadata>;
35
36 fn reset() {
38 Self::MetadataStorage::clear();
39 Self::OriginalCodeStorage::clear();
40 Self::InstrumentedLenStorage::clear();
41 Self::InstrumentedCodeStorage::clear();
42 }
43
44 fn add_code(code_and_id: CodeAndId, metadata: CodeMetadata) -> Result<(), Error> {
45 let (code, code_id) = code_and_id.into_parts();
46 let (code, original_code) = code.into_parts();
47
48 Self::InstrumentedCodeStorage::mutate(code_id, |maybe| {
49 if maybe.is_some() {
50 return Err(CodeStorageError::DuplicateItem);
51 }
52
53 Self::InstrumentedLenStorage::insert(code_id, code.code().len() as u32);
54 Self::OriginalCodeStorage::insert(code_id, original_code);
55 Self::MetadataStorage::insert(code_id, metadata);
56
57 *maybe = Some(code);
58 Ok(())
59 })
60 }
61
62 fn update_code(code_and_id: InstrumentedCodeAndId) {
64 let (code, code_id) = code_and_id.into_parts();
65
66 Self::InstrumentedLenStorage::insert(code_id, code.code().len() as u32);
67 Self::InstrumentedCodeStorage::insert(code_id, code);
68 }
69
70 fn exists(code_id: CodeId) -> bool {
71 Self::InstrumentedCodeStorage::contains_key(&code_id)
72 }
73
74 fn remove_code(code_id: CodeId) -> bool {
78 Self::InstrumentedCodeStorage::mutate(code_id, |maybe| {
79 if maybe.is_none() {
80 return false;
81 }
82
83 Self::InstrumentedLenStorage::remove(code_id);
84 Self::OriginalCodeStorage::remove(code_id);
85 Self::MetadataStorage::remove(code_id);
86
87 *maybe = None;
88 true
89 })
90 }
91
92 fn get_code(code_id: CodeId) -> Option<InstrumentedCode> {
93 Self::InstrumentedCodeStorage::get(&code_id)
94 }
95
96 fn get_code_len(code_id: CodeId) -> Option<u32> {
97 Self::InstrumentedLenStorage::get(&code_id)
98 }
99
100 fn get_original_code(code_id: CodeId) -> Option<Vec<u8>> {
101 Self::OriginalCodeStorage::get(&code_id)
102 }
103
104 fn get_metadata(code_id: CodeId) -> Option<CodeMetadata> {
105 Self::MetadataStorage::get(&code_id)
106 }
107}