Skip to main content

hashiverse_client_wasm/
wasm_local_settings.rs

1use 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}