diff options
-rw-r--r-- | calendar/Cargo.toml | 5 | ||||
-rw-r--r-- | calendar/src/main.rs | 31 |
2 files changed, 22 insertions, 14 deletions
diff --git a/calendar/Cargo.toml b/calendar/Cargo.toml index 1ab2d69..f7e3c8e 100644 --- a/calendar/Cargo.toml +++ b/calendar/Cargo.toml @@ -4,9 +4,10 @@ version = "0.1.0" edition = "2021" [dependencies] +clap = { version = "4.4", features = ["derive"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -reqwest = { version = "0.11", features = ["blocking", "json"] } regex = "1.10" tempfile = "3.8" -anyhow = "1.0"
\ No newline at end of file +reqwest = { version = "0.11", features = ["blocking", "json"] } +anyhow = "1.0" diff --git a/calendar/src/main.rs b/calendar/src/main.rs index 2b59c12..ea6fc6f 100644 --- a/calendar/src/main.rs +++ b/calendar/src/main.rs @@ -1,16 +1,21 @@ -use std::{fs, io::Write}; +use std::{fs, io::Write, path::PathBuf}; +use clap::Parser; use serde::Deserialize; use regex::Regex; use tempfile::tempdir; use reqwest::blocking::Client; -#[derive(Deserialize)] -struct Config { - calendar: CalendarConfig, +/// ICS zu CalDAV Uploader +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +struct Args { + /// Pfad zur Konfigurationsdatei (config.json) + #[arg(short, long, value_name = "FILE")] + config: PathBuf, } #[derive(Deserialize)] -struct CalendarConfig { +struct Config { caldav_base_url: String, caldav_username: String, caldav_password: String, @@ -24,15 +29,17 @@ struct CalendarEntry { } fn main() -> anyhow::Result<()> { - let base_dir = "/home/leonard/Projects/scripts"; - let config_path = format!("{}/config.json", base_dir); - let config_data = fs::read_to_string(&config_path)?; + let args = Args::parse(); + + let config_data = fs::read_to_string(&args.config)?; let config: Config = serde_json::from_str(&config_data)?; let tmp_dir = tempdir()?; - let client = Client::new(); + let client = Client::builder() + .timeout(std::time::Duration::from_secs(60)) + .build()?; - for cal in &config.calendar.calendars { + for cal in &config.calendars { println!("INFO: Lade ICS von: {}", cal.ics); let ics_path = tmp_dir.path().join(format!("{}.ics", cal.name)); let response = client.get(&cal.ics).send()?; @@ -43,7 +50,7 @@ fn main() -> anyhow::Result<()> { let ics_content = response.text()?; fs::write(&ics_path, &ics_content)?; - let caldav_url = format!("{}/{}", config.calendar.caldav_base_url.trim_end_matches('/'), cal.name); + let caldav_url = format!("{}/{}", config.caldav_base_url.trim_end_matches('/'), cal.name); println!("INFO: Zerlege Datei: {:?}", ics_path); let vevent_blocks = split_vevents(&ics_content); @@ -65,7 +72,7 @@ fn main() -> anyhow::Result<()> { let body = fs::read(&event_path)?; let put_response = client .put(&put_url) - .basic_auth(&config.calendar.caldav_username, Some(&config.calendar.caldav_password)) + .basic_auth(&config.caldav_username, Some(&config.caldav_password)) .header("Content-Type", "text/calendar; charset=utf-8") .body(body) .send()?; |