radix_engine_interface/api/
field_api.rs1use bitflags::bitflags;
2use radix_common::data::scrypto::{scrypto_decode, scrypto_encode, ScryptoDecode, ScryptoEncode};
3use sbor::rust::fmt::Debug;
4use sbor::rust::vec::Vec;
5use sbor::*;
6
7bitflags! {
8 #[derive(Sbor)]
9 pub struct LockFlags: u32 {
10 const MUTABLE = 0b00000001;
12 const UNMODIFIED_BASE = 0b00000010;
16 const FORCE_WRITE = 0b00000100;
19 }
20}
21
22impl LockFlags {
23 pub fn read_only() -> Self {
24 LockFlags::empty()
25 }
26}
27
28pub type FieldHandle = u32;
29
30pub trait FieldPayloadMarker {}
31
32impl<T: FieldPayloadMarker> FieldPayloadMarker for &T {}
33
34pub trait SystemFieldApi<E: Debug> {
36 fn field_read(&mut self, handle: FieldHandle) -> Result<Vec<u8>, E>;
38
39 fn field_read_typed<S: ScryptoDecode>(&mut self, handle: FieldHandle) -> Result<S, E> {
41 let buf = self.field_read(handle)?;
42 let typed_substate: S = scrypto_decode(&buf).map_err(|e| e).unwrap();
43 Ok(typed_substate)
44 }
45
46 fn field_write(&mut self, handle: FieldHandle, buffer: Vec<u8>) -> Result<(), E>;
48
49 fn field_write_typed<S: ScryptoEncode>(
51 &mut self,
52 handle: FieldHandle,
53 substate: &S,
54 ) -> Result<(), E> {
55 let buf = scrypto_encode(substate).unwrap();
56 self.field_write(handle, buf)
57 }
58
59 fn field_lock(&mut self, handle: FieldHandle) -> Result<(), E>;
61
62 fn field_close(&mut self, handle: FieldHandle) -> Result<(), E>;
64}