antenna_client_web/storage/
mod.rs1use antenna_client_shared::IdentityStorage;
2use antenna_protocol::Identity;
3use anyhow::{Context, Result, anyhow};
4
5pub struct Storage {
7 path: String,
8}
9
10impl Storage {
11 pub fn new(path: impl Into<String>) -> Self {
12 Self { path: path.into() }
13 }
14
15 pub fn path(&self) -> &str {
16 &self.path
17 }
18}
19
20impl IdentityStorage for Storage {
21 fn load_identity(&self) -> Option<Identity> {
22 let raw = web_sys::window()?
23 .local_storage()
24 .ok()??
25 .get_item(&self.path)
26 .ok()??;
27 serde_json::from_str(&raw).ok()
28 }
29
30 fn save_identity(&self, identity: &Identity) -> Result<()> {
31 let json = serde_json::to_string(identity)?;
32 web_sys::window()
33 .context("DOM window is unavailable")?
34 .local_storage()
35 .map_err(|e| anyhow!("{:?}", e))?
36 .context("LocalStorage is unavailable")?
37 .set_item(&self.path, &json)
38 .map_err(|e| anyhow!("{:?}", e))?;
39 Ok(())
40 }
41}