use idxdb_store::account::JsStorageMapEntry;
use miden_client::account::{
AccountStorage as NativeAccountStorage,
StorageSlotContent,
StorageSlotName,
};
use wasm_bindgen::prelude::*;
use crate::models::word::Word;
#[derive(Clone)]
#[wasm_bindgen]
pub struct AccountStorage(NativeAccountStorage);
#[wasm_bindgen]
impl AccountStorage {
pub fn commitment(&self) -> Word {
self.0.to_commitment().into()
}
#[wasm_bindgen(js_name = "getItem")]
pub fn get_item(&self, slot_name: &str) -> Option<Word> {
let slot_name = StorageSlotName::new(slot_name).ok()?;
self.0.get_item(&slot_name).ok().map(Into::into)
}
#[wasm_bindgen(js_name = "getSlotNames")]
pub fn get_slot_names(&self) -> Vec<String> {
self.0.slots().iter().map(|slot| slot.name().as_str().to_string()).collect()
}
#[wasm_bindgen(js_name = "getMapItem")]
pub fn get_map_item(&self, slot_name: &str, key: &Word) -> Option<Word> {
match StorageSlotName::new(slot_name) {
Ok(slot_name) => self.0.get_map_item(&slot_name, key.into()).ok().map(Into::into),
Err(_) => None,
}
}
#[wasm_bindgen(js_name = "getMapEntries")]
pub fn get_map_entries(&self, slot_name: &str) -> Option<Vec<JsStorageMapEntry>> {
let slot = self.0.slots().iter().find(|slot| slot.name().as_str() == slot_name)?;
let StorageSlotContent::Map(map) = slot.content() else {
return None;
};
Some(JsStorageMapEntry::from_map(map, slot_name))
}
}
impl From<NativeAccountStorage> for AccountStorage {
fn from(native_account_storage: NativeAccountStorage) -> Self {
AccountStorage(native_account_storage)
}
}
impl From<&NativeAccountStorage> for AccountStorage {
fn from(native_account_storage: &NativeAccountStorage) -> Self {
AccountStorage(native_account_storage.clone())
}
}