hashiverse_client_wasm/
wasm_local_settings.rs1use anyhow::anyhow;
2use indexed_db_futures::database::Database;
3use indexed_db_futures::prelude::*;
4use indexed_db_futures::transaction::TransactionMode;
5use indexed_db_futures::KeyPath;
6use serde::{Deserialize, Serialize};
7
8const DATABASE_NAME: &str = "hashiverse.local_settings";
9const STORE_NAME: &str = "settings";
10
11#[derive(Serialize, Deserialize)]
12struct Setting {
13 key: String,
14 value: String,
15}
16
17async fn open_db() -> anyhow::Result<Database> {
18 Database::open(DATABASE_NAME)
19 .with_version(1u8)
20 .with_on_upgrade_needed(|_, db| {
21 db.create_object_store(STORE_NAME)
22 .with_key_path(KeyPath::from("key"))
23 .build()?;
24 Ok(())
25 })
26 .build()
27 .map_err(|e| anyhow!("{}", e))?
28 .await
29 .map_err(|e| anyhow!("{}", e))
30}
31
32pub async fn local_settings_get(key: &str) -> anyhow::Result<Option<String>> {
33 let db = open_db().await?;
34 let transaction = db
35 .transaction(STORE_NAME)
36 .with_mode(TransactionMode::Readonly)
37 .build()
38 .map_err(|e| anyhow!("{}", e))?;
39 let store = transaction.object_store(STORE_NAME).map_err(|e| anyhow!("{}", e))?;
40 let setting: Option<Setting> = store
41 .get(key)
42 .serde()
43 .map_err(|e| anyhow!("{}", e))?
44 .await
45 .map_err(|e| anyhow!("{}", e))?;
46 Ok(setting.map(|s| s.value))
47}