use std::path::Path;
use anyhow::Context as _;
use anyhow::Result;
use crate::cap::FileCap;
use crate::ser::backends::Json;
use crate::ser::state::UiState as SerUiState;
use crate::ser::ToSerde;
use crate::state::load_state_from_file;
use crate::state::save_state_to_file;
#[derive(Debug, Default)]
pub struct State {
pub selected_tasks: Vec<Option<usize>>,
pub selected_view: Option<usize>,
}
impl State {
pub async fn load(state_path: &Path) -> Result<Self> {
let state = load_state_from_file::<Json, SerUiState>(state_path)
.await
.with_context(|| format!("failed to load UI state from {}", state_path.display()))?
.unwrap_or_default();
Ok(Self::with_serde(state))
}
pub fn with_serde(state: SerUiState) -> Self {
Self {
selected_tasks: state.selected_tasks,
selected_view: state.selected_view,
}
}
pub async fn save(&self, file_cap: &mut FileCap<'_>) -> Result<()> {
save_state_to_file::<Json, _>(file_cap, &self.to_serde()).await
}
}
impl ToSerde for State {
type Output = SerUiState;
fn to_serde(&self) -> Self::Output {
let state = SerUiState {
selected_tasks: self.selected_tasks.clone(),
selected_view: self.selected_view,
};
state
}
}