feat: persist notes

This commit is contained in:
electria 2026-06-25 18:34:14 -07:00
commit 8036728152
Signed by: electria
SSH key fingerprint: SHA256:8LlB3ucPbBHqozqkhsNbaV5oG3SlzzqUj8FZDL6IPQs
2 changed files with 24 additions and 3 deletions

View file

@ -1,5 +1,12 @@
use serde::{Deserialize, Serialize};
/// persistent data of the app; created when loading or saving
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct Saved {
pub table: Table,
pub notes: String,
}
pub type Table = Vec<Category>;
#[derive(Clone, Debug, Default, Deserialize, Serialize)]

View file

@ -59,9 +59,17 @@ impl State {
fn new() -> Self {
let mut state = Self::default();
if let Ok(file) =
fs::File::open(data!()).inspect_err(|e| eprintln!("failed to read data file: {e}"))
fs::File::open(data!()).inspect_err(|e| eprintln!("failed to open data file: {e}"))
{
state.table = ron::de::from_reader(file).unwrap();
if let Ok(saved) = ron::de::from_reader::<_, data::Saved>(&file)
.inspect_err(|e| eprintln!("failed to read current version of data file: {e}, trying to restore old version"))
{
state.table = saved.table;
state.content = widget::text_editor::Content::with_text(&saved.notes);
} else {
// try to read it as an older version on error
state.table = ron::de::from_reader(&file).unwrap();
}
}
state
@ -229,7 +237,13 @@ impl State {
impl Drop for State {
fn drop(&mut self) {
ron::Options::default()
.to_io_writer(fs::File::create(data!()).unwrap(), &self.table)
.to_io_writer(
fs::File::create(data!()).unwrap(),
&data::Saved {
table: self.table.clone(),
notes: self.content.text(),
},
)
.unwrap();
}
}