saturn_cli/db/
mod.rs

1pub mod google;
2pub mod google_macros;
3pub mod memory;
4pub mod remote;
5pub mod unixfile;
6
7use crate::{
8    parsers::entry::EntryParser,
9    record::{Record, RecurringRecord},
10};
11use anyhow::Result;
12use async_trait::async_trait;
13
14#[async_trait]
15pub trait DB: Send {
16    async fn load(&mut self) -> Result<()>;
17    async fn dump(&self) -> Result<()>;
18
19    fn next_key(&mut self) -> u64 {
20        let key = self.primary_key() + 1;
21        self.set_primary_key(key);
22        key
23    }
24
25    fn next_recurrence_key(&mut self) -> u64 {
26        let key = self.recurrence_key() + 1;
27        self.set_recurrence_key(key);
28        key
29    }
30
31    fn primary_key(&self) -> u64;
32    fn set_primary_key(&mut self, primary_key: u64);
33    fn recurrence_key(&self) -> u64;
34    fn set_recurrence_key(&mut self, primary_key: u64);
35
36    async fn record_entry(&mut self, entry: EntryParser) -> Result<()> {
37        let record = entry.to_record()?;
38        let recurrence = record.recurrence();
39        let mut record = record.record();
40        record.set_primary_key(self.next_key());
41
42        if let Some(mut recurrence) = recurrence {
43            let key = if let Some(key) = record.recurrence_key() {
44                key
45            } else {
46                self.next_recurrence_key()
47            };
48            record.set_recurrence_key(Some(key));
49            recurrence.set_record(record);
50            recurrence.set_recurrence_key(key);
51            self.record_recurrence(recurrence).await?;
52        } else {
53            self.record(record).await?;
54        }
55
56        Ok(())
57    }
58
59    async fn update(&mut self, record: Record) -> Result<()>;
60    async fn update_recurring(&mut self, record: RecurringRecord) -> Result<()>;
61    async fn get(&mut self, primary_key: u64) -> Result<Record>;
62    async fn get_recurring(&mut self, primary_key: u64) -> Result<RecurringRecord>;
63    async fn delete(&mut self, primary_key: u64) -> Result<()>;
64    async fn delete_recurrence(&mut self, primary_key: u64) -> Result<Vec<String>>;
65    async fn record(&mut self, record: Record) -> Result<()>;
66    async fn record_recurrence(&mut self, record: RecurringRecord) -> Result<()>;
67    async fn insert_record(&mut self, record: Record) -> Result<()>;
68    async fn insert_recurrence(&mut self, record: RecurringRecord) -> Result<()>;
69    async fn list_recurrence(&mut self) -> Result<Vec<RecurringRecord>>;
70    async fn update_recurrence(&mut self) -> Result<()>;
71    async fn list_today(&mut self, include_completed: bool) -> Result<Vec<Record>>;
72    async fn list_all(&mut self, include_completed: bool) -> Result<Vec<Record>>;
73    async fn events_now(
74        &mut self,
75        last: chrono::Duration,
76        include_completed: bool,
77    ) -> Result<Vec<Record>>;
78    async fn complete_task(&mut self, primary_key: u64) -> Result<()>;
79}
80
81#[async_trait]
82pub trait RemoteClient {
83    async fn update(&mut self, calendar_id: String, record: Record) -> Result<()>;
84    async fn update_recurring(
85        &mut self,
86        calendar_id: String,
87        record: RecurringRecord,
88    ) -> Result<()>;
89    async fn get(&mut self, calendar_id: String, event_id: String) -> Result<Record>;
90    async fn get_recurring(
91        &mut self,
92        calendar_id: String,
93        event_id: String,
94    ) -> Result<RecurringRecord>;
95    async fn delete(&mut self, calendar_id: String, event_id: String) -> Result<()>;
96    async fn delete_recurrence(
97        &mut self,
98        calendar_id: String,
99        event_id: String,
100    ) -> Result<Vec<String>>;
101    async fn record(&mut self, calendar_id: String, record: Record) -> Result<String>;
102    async fn record_recurrence(
103        &mut self,
104        calendar_id: String,
105        record: RecurringRecord,
106    ) -> Result<(String, String)>;
107    async fn list_recurrence(&mut self, calendar_id: String) -> Result<Vec<RecurringRecord>>;
108    async fn update_recurrence(&mut self, calendar_id: String) -> Result<()>;
109    async fn list_today(
110        &mut self,
111        calendar_id: String,
112        include_completed: bool,
113    ) -> Result<Vec<Record>>;
114    async fn list_all(
115        &mut self,
116        calendar_id: String,
117        include_completed: bool,
118    ) -> Result<Vec<Record>>;
119    async fn events_now(
120        &mut self,
121        calendar_id: String,
122        last: chrono::Duration,
123        include_completed: bool,
124    ) -> Result<Vec<Record>>;
125    async fn complete_task(&mut self, calendar_id: String, primary_key: u64) -> Result<()>;
126}