Trying very hard not to miss calendar events
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Parametrize start and end date

Co-authored-by: Claude <noreply@anthropic.com>

+83 -12
+1
crates/eds-cal-cli/Cargo.toml
··· 6 6 [dependencies] 7 7 eds-cal-rs = { path = "../eds-cal-rs" } 8 8 clap = { version = "4.5.54", features = ["derive"] } 9 + chrono = "0.4"
+80 -10
crates/eds-cal-cli/src/main.rs
··· 1 - use clap::{Parser, Subcommand}; 1 + use chrono::{Local, NaiveDate}; 2 + use clap::{Args, Parser, Subcommand}; 2 3 use eds_cal_rs::{CalendarClient, EventTime, GLibVersion, SourceRegistry}; 3 4 4 5 #[derive(Parser)] ··· 35 36 #[derive(Subcommand)] 36 37 enum EventsCommands { 37 38 /// List events from now to 60 days ahead 38 - List, 39 + List(ListEventsArgs), 40 + } 41 + 42 + #[derive(Args)] 43 + struct ListEventsArgs { 44 + /// Filter events by source UID 45 + #[arg(long)] 46 + source: Option<String>, 47 + 48 + /// Start date (YYYY-MM-DD format). Defaults to now 49 + #[arg(long)] 50 + date_from: Option<String>, 51 + 52 + /// End date (YYYY-MM-DD format). Defaults to 60 days from now 53 + #[arg(long)] 54 + date_until: Option<String>, 55 + } 56 + 57 + fn parse_date(date_str: &str) -> Result<i64, String> { 58 + let date = NaiveDate::parse_from_str(date_str, "%Y-%m-%d") 59 + .map_err(|e| format!("Invalid date format (expected YYYY-MM-DD): {}", e))?; 60 + 61 + // Convert to Unix timestamp at midnight in local timezone 62 + let datetime = date.and_hms_opt(0, 0, 0).unwrap(); 63 + Ok(datetime.and_local_timezone(Local).unwrap().timestamp()) 39 64 } 40 65 41 66 fn print_version() { ··· 76 101 0 77 102 } 78 103 79 - fn list_events() -> i32 { 104 + fn list_events(args: &ListEventsArgs) -> i32 { 80 105 let registry = match SourceRegistry::new() { 81 106 Ok(reg) => reg, 82 107 Err(e) => { ··· 85 110 } 86 111 }; 87 112 88 - let now = std::time::SystemTime::now() 89 - .duration_since(std::time::UNIX_EPOCH) 90 - .expect("System time is before Unix epoch") 91 - .as_secs() as i64; 92 - let end_time = now + (60 * 24 * 60 * 60); 113 + // Parse date_from or default to now 114 + let start_time = if let Some(date_str) = &args.date_from { 115 + match parse_date(date_str) { 116 + Ok(ts) => ts, 117 + Err(e) => { 118 + eprintln!("Invalid date-from format: {}", e); 119 + return 1; 120 + } 121 + } 122 + } else { 123 + std::time::SystemTime::now() 124 + .duration_since(std::time::UNIX_EPOCH) 125 + .expect("System time is before Unix epoch") 126 + .as_secs() as i64 127 + }; 128 + 129 + // Parse date_until or default to 60 days from start 130 + let end_time = if let Some(date_str) = &args.date_until { 131 + match parse_date(date_str) { 132 + Ok(ts) => ts, 133 + Err(e) => { 134 + eprintln!("Invalid date-until format: {}", e); 135 + return 1; 136 + } 137 + } 138 + } else { 139 + start_time + (60 * 24 * 60 * 60) 140 + }; 93 141 94 142 let sources = match registry.list_sources() { 95 143 Ok(srcs) => srcs, ··· 99 147 } 100 148 }; 101 149 150 + // Filter sources if --source is specified 151 + let sources: Vec<_> = if let Some(filter_uid) = &args.source { 152 + sources 153 + .into_iter() 154 + .filter(|s| s.uid() == filter_uid) 155 + .collect() 156 + } else { 157 + sources 158 + }; 159 + 160 + if sources.is_empty() { 161 + if args.source.is_some() { 162 + eprintln!( 163 + "No source found with UID: {}", 164 + args.source.as_ref().unwrap() 165 + ); 166 + } else { 167 + eprintln!("No calendar sources found"); 168 + } 169 + return 1; 170 + } 171 + 102 172 let mut total_events = 0; 103 173 104 174 for source in sources { ··· 112 182 } 113 183 }; 114 184 115 - let events = match client.list_events(now, end_time) { 185 + let events = match client.list_events(start_time, end_time) { 116 186 Ok(evts) => evts, 117 187 Err(e) => { 118 188 eprintln!("Failed to query events from '{}': {}", display_name, e); ··· 172 242 SourcesCommands::List => list_sources(), 173 243 }, 174 244 Commands::Events { action } => match action { 175 - EventsCommands::List => list_events(), 245 + EventsCommands::List(args) => list_events(&args), 176 246 }, 177 247 }; 178 248
+2 -2
crates/eds-cal-rs/src/lib.rs
··· 4 4 //! C APIs for calendar and event management. 5 5 6 6 pub mod constants; 7 - mod ffi; 8 - mod event; 9 7 mod core; 8 + mod event; 9 + mod ffi; 10 10 11 11 // Re-export commonly used types for convenience 12 12 pub use core::{CalendarClient, EdsError, GLibVersion, Result, Source, SourceRegistry};