ic_cdk/
storage.rs

1//! Tools for managing stable storage of data in a canister.
2use crate::stable;
3
4/// Saves the storage into the stable memory.
5///
6/// This will override any value previously stored in stable memory.
7pub fn stable_save<T>(t: T) -> Result<(), candid::Error>
8where
9    T: candid::utils::ArgumentEncoder,
10{
11    candid::write_args(&mut stable::StableWriter::default(), t)
12}
13
14/// Restores a value from the stable memory to the storage.
15///
16/// There can only be one value in stable memory, currently.
17pub fn stable_restore<T>() -> Result<T, String>
18where
19    T: for<'de> candid::utils::ArgumentDecoder<'de>,
20{
21    let bytes = stable::stable_bytes();
22
23    let mut de = candid::de::IDLDeserialize::new(bytes.as_slice()).map_err(|e| format!("{e:?}"))?;
24    let res = candid::utils::ArgumentDecoder::decode(&mut de).map_err(|e| format!("{e:?}"))?;
25    Ok(res)
26}