boat_lib/repository/
mod.rs1use 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 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}