use super::Capabilities;
use crate::game::state::GameState;
pub const CAPABILITIES: Capabilities = Capabilities { can_quit: false };
const SAVE_KEY: &str = "cuqueclicker:save";
pub struct Persistence;
impl Default for Persistence {
fn default() -> Self {
Self::new()
}
}
impl Persistence {
pub fn new() -> Self {
Self
}
pub fn load(&self) -> GameState {
if let Some(storage) = local_storage()
&& let Ok(Some(data)) = storage.get_item(SAVE_KEY)
{
return crate::save::load_from_str(&data);
}
GameState::default().migrate_runtime()
}
pub fn save(&self, state: &GameState) -> anyhow::Result<()> {
let Some(storage) = local_storage() else {
return Ok(());
};
let data = crate::save::save_to_string(state)?;
let _ = storage.set_item(SAVE_KEY, &data);
Ok(())
}
}
pub struct InstanceLock;
impl InstanceLock {
pub fn try_acquire() -> std::io::Result<Self> {
Ok(InstanceLock)
}
}
fn local_storage() -> Option<web_sys::Storage> {
web_sys::window()?.local_storage().ok().flatten()
}