use bevy_log::error;
use bevy_tasks::IoTaskPool;
use web_sys::window;
pub(crate) struct SettingsStore {
app_name: String,
}
impl SettingsStore {
pub fn new(app_name: &str) -> Self {
Self {
app_name: app_name.to_owned(),
}
}
fn storage_key(&self, filename: &str) -> String {
format!("{}-{}", self.app_name, filename)
}
pub(crate) fn save(&self, filename: &str, contents: toml::Table) {
if let Ok(Some(storage)) = window().unwrap().local_storage() {
let toml_str = contents.to_string();
storage
.set_item(self.storage_key(filename).as_str(), &toml_str)
.unwrap();
}
}
pub(crate) fn save_async(&self, filename: &str, contents: toml::Table) {
IoTaskPool::get().scope(|scope| {
scope.spawn(async {
if let Ok(Some(storage)) = window().unwrap().local_storage() {
let toml_str = contents.to_string();
storage
.set_item(self.storage_key(filename).as_str(), &toml_str)
.unwrap();
}
});
});
}
pub(crate) fn load(&self, filename: &str) -> Option<toml::Table> {
if let Ok(Some(storage)) = window().unwrap().local_storage() {
let storage_key = self.storage_key(filename);
let Ok(Some(toml_str)) = storage.get_item(&storage_key) else {
return None;
};
let table_value = match toml::from_str::<toml::Value>(&toml_str) {
Ok(table_value) => table_value,
Err(e) => {
error!("Error parsing settings file: {}", e);
return None;
}
};
match table_value {
toml::Value::Table(table) => Some(table),
_ => {
error!("Settings file must be a table");
None
}
}
} else {
None
}
}
}