Config parsing

This commit is contained in:
Alexey 2025-09-08 17:29:21 +03:00
commit e815e5b439
5 changed files with 89 additions and 8 deletions

34
Cargo.lock generated
View file

@ -150,8 +150,10 @@ name = "aliveline"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"chrono", "chrono",
"serde",
"slint", "slint",
"slint-build", "slint-build",
"toml 0.9.5",
] ]
[[package]] [[package]]
@ -3833,6 +3835,15 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "serde_spanned"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "shlex" name = "shlex"
version = "1.3.0" version = "1.3.0"
@ -3893,7 +3904,7 @@ dependencies = [
"regex", "regex",
"serde_json", "serde_json",
"tar", "tar",
"toml", "toml 0.8.23",
] ]
[[package]] [[package]]
@ -4160,7 +4171,7 @@ dependencies = [
"cfg-expr", "cfg-expr",
"heck", "heck",
"pkg-config", "pkg-config",
"toml", "toml 0.8.23",
"version-compare", "version-compare",
] ]
@ -4334,11 +4345,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
dependencies = [ dependencies = [
"serde", "serde",
"serde_spanned", "serde_spanned 0.6.9",
"toml_datetime 0.6.11", "toml_datetime 0.6.11",
"toml_edit 0.22.27", "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]] [[package]]
name = "toml_datetime" name = "toml_datetime"
version = "0.6.11" version = "0.6.11"
@ -4365,7 +4391,7 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
dependencies = [ dependencies = [
"indexmap", "indexmap",
"serde", "serde",
"serde_spanned", "serde_spanned 0.6.9",
"toml_datetime 0.6.11", "toml_datetime 0.6.11",
"toml_write", "toml_write",
"winnow", "winnow",

View file

@ -7,7 +7,9 @@ edition = "2021"
[dependencies] [dependencies]
chrono = "0.4.42" chrono = "0.4.42"
serde = "1.0.219"
slint = "1.12.1" slint = "1.12.1"
toml = "0.9.5"
[build-dependencies] [build-dependencies]
slint-build = "1.12.1" slint-build = "1.12.1"

20
src/config.rs Normal file
View file

@ -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()
}
}

14
src/lib.rs Normal file
View file

@ -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()
}

View file

@ -3,6 +3,7 @@
use std::error::Error; use std::error::Error;
use aliveline::{config::Config, load_config};
use chrono::Timelike; use chrono::Timelike;
use slint::{Model, SharedString, VecModel}; use slint::{Model, SharedString, VecModel};
@ -19,7 +20,10 @@ fn main() -> Result<(), Box<dyn Error>> {
let ui_weak = ui.as_weak(); let ui_weak = ui.as_weak();
move |hours_string: SharedString| { move |hours_string: SharedString| {
let ui = ui_weak.unwrap(); let ui = ui_weak.unwrap();
let hours = hours_string.split(' ').next().map(|a| a.parse::<i32>().unwrap()).unwrap(); let hours = hours_string.split(' ')
.next()
.map(|h| h.parse::<i32>().unwrap())
.unwrap();
ui.set_record_visible_time(hours * 3600); ui.set_record_visible_time(hours * 3600);
} }
}); });
@ -29,9 +33,16 @@ fn main() -> Result<(), Box<dyn Error>> {
move |event_name: SharedString| { move |event_name: SharedString| {
let ui = ui_weak.unwrap(); let ui = ui_weak.unwrap();
let events_rc = ui.get_record_events(); let events_rc = ui.get_record_events();
let events = events_rc.as_any().downcast_ref::<VecModel<TimelineEvent>>().unwrap(); let events = events_rc.as_any()
.downcast_ref::<VecModel<TimelineEvent>>()
.unwrap();
let offset = ui.get_record_offset(); 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<dyn Error>> {
let event_id = events.iter().position(|data| !data.finished).unwrap(); 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 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); events.set_row_data(event_id, new_event);
} }
@ -60,6 +76,9 @@ fn main() -> Result<(), Box<dyn Error>> {
} }
}); });
let config: Config = load_config();
println!("logs path: {}", config.log_path.to_str().unwrap());
ui.run()?; ui.run()?;
Ok(()) Ok(())