From e815e5b43933946577a9b6e84553b038b3bcc322 Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Mon, 8 Sep 2025 17:29:21 +0300 Subject: [PATCH] Config parsing --- Cargo.lock | 34 ++++++++++++++++++++++++++++++---- Cargo.toml | 2 ++ src/config.rs | 20 ++++++++++++++++++++ src/lib.rs | 14 ++++++++++++++ src/main.rs | 27 +++++++++++++++++++++++---- 5 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 src/config.rs create mode 100644 src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6848e56..5aa4671 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -150,8 +150,10 @@ name = "aliveline" version = "0.1.0" dependencies = [ "chrono", + "serde", "slint", "slint-build", + "toml 0.9.5", ] [[package]] @@ -3833,6 +3835,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +dependencies = [ + "serde", +] + [[package]] name = "shlex" version = "1.3.0" @@ -3893,7 +3904,7 @@ dependencies = [ "regex", "serde_json", "tar", - "toml", + "toml 0.8.23", ] [[package]] @@ -4160,7 +4171,7 @@ dependencies = [ "cfg-expr", "heck", "pkg-config", - "toml", + "toml 0.8.23", "version-compare", ] @@ -4334,11 +4345,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", - "serde_spanned", + "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_edit 0.22.27", ] +[[package]] +name = "toml" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 1.0.0", + "toml_datetime 0.7.0", + "toml_parser", + "toml_writer", + "winnow", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -4365,7 +4391,7 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", - "serde_spanned", + "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_write", "winnow", diff --git a/Cargo.toml b/Cargo.toml index 6fd6da8..b2244c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,9 @@ edition = "2021" [dependencies] chrono = "0.4.42" +serde = "1.0.219" slint = "1.12.1" +toml = "0.9.5" [build-dependencies] slint-build = "1.12.1" diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..debad15 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,20 @@ +use std::path::PathBuf; +use serde::Deserialize; + +#[derive(Deserialize)] +pub struct Config { + pub log_path: PathBuf +} + +impl Config { + pub fn new() -> Self { + Config { log_path: PathBuf::from("./logs") } + } + + pub fn load(path: PathBuf) -> Self { + if let Ok(toml_string) = std::fs::read_to_string(path) { + return toml::from_str(&toml_string).unwrap_or(Config::new()); + } + Config::new() + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..6d93152 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,14 @@ +use config::Config; +use std::path::PathBuf; + +pub mod config; + +pub fn load_config() -> Config { + if let Ok(path_str) = std::env::var("XDG_CONFIG_HOME") { + let mut path = PathBuf::from(path_str); + path.push("aliveline"); + path.push("config.toml"); + return Config::load(path); + } + Config::new() +} diff --git a/src/main.rs b/src/main.rs index 67bf1ce..2a747ef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::error::Error; +use aliveline::{config::Config, load_config}; use chrono::Timelike; use slint::{Model, SharedString, VecModel}; @@ -19,7 +20,10 @@ fn main() -> Result<(), Box> { let ui_weak = ui.as_weak(); move |hours_string: SharedString| { let ui = ui_weak.unwrap(); - let hours = hours_string.split(' ').next().map(|a| a.parse::().unwrap()).unwrap(); + let hours = hours_string.split(' ') + .next() + .map(|h| h.parse::().unwrap()) + .unwrap(); ui.set_record_visible_time(hours * 3600); } }); @@ -29,9 +33,16 @@ fn main() -> Result<(), Box> { move |event_name: SharedString| { let ui = ui_weak.unwrap(); let events_rc = ui.get_record_events(); - let events = events_rc.as_any().downcast_ref::>().unwrap(); + let events = events_rc.as_any() + .downcast_ref::>() + .unwrap(); let offset = ui.get_record_offset(); - events.push(TimelineEvent { duration: 0, finished: false, label: event_name, start: offset }); + events.push(TimelineEvent { + duration: 0, + finished: false, + label: event_name, + start: offset + }); } }); @@ -45,7 +56,12 @@ fn main() -> Result<(), Box> { let event_id = events.iter().position(|data| !data.finished).unwrap(); let event = events.row_data(event_id).expect("stop-event called without unfinished events"); - let new_event = TimelineEvent { duration: offset - event.start, finished: true, label: event.label, start: event.start }; + let new_event = TimelineEvent { + duration: offset - event.start, + finished: true, + label: event.label, + start: event.start + }; events.set_row_data(event_id, new_event); } @@ -60,6 +76,9 @@ fn main() -> Result<(), Box> { } }); + let config: Config = load_config(); + println!("logs path: {}", config.log_path.to_str().unwrap()); + ui.run()?; Ok(())