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}