Skip to main content

boat_lib/repository/
mod.rs

1use anyhow::Result;
2use chrono::{DateTime, Utc};
3use std::fmt::Debug;
4
5pub mod activities_repository;
6pub mod logs_repository;
7pub mod tags_repository;
8
9pub type Id = i64;
10
11pub trait Repository<T: RepositoryItem>: Debug {
12    fn create(&mut self, item: T) -> Result<Id>;
13    fn get(&self, id: Id) -> Result<Option<T>>;
14    fn list(&self) -> Result<Vec<T>>;
15    fn update(&mut self, item: T) -> Result<()>;
16    fn delete(&mut self, id: Id) -> Result<()>;
17}
18
19pub trait RepositoryItem {
20    fn id(&self) -> Id;
21    fn set_id(&mut self, value: Id);
22}
23
24pub fn parse_datetime(value: Option<String>) -> rusqlite::Result<Option<DateTime<Utc>>> {
25    match value {
26        Some(s) => {
27            // SQLite format: "2026-03-22 21:47:00" → add T/Z for RFC3339
28            let rfc3339 = format!("{}Z", s.replace(" ", "T"));
29            let dt = DateTime::parse_from_rfc3339(&rfc3339)
30                .map_err(|e| {
31                    eprintln!("Parse error on '{}': {}", s, e);
32                    rusqlite::Error::InvalidQuery
33                })?
34                .with_timezone(&Utc);
35            Ok(Some(dt))
36        }
37        None => Ok(None),
38    }
39}