diff --git a/Cargo.toml b/Cargo.toml index 0a751e9..b19c11b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,3 +16,4 @@ url = { version = "2.2", features = ["serde"] } bitflags = "1.2" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +async-trait = "0.1" diff --git a/src/lib.rs b/src/lib.rs index 1724ca4..1df735f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,8 @@ //! A `Provider` abstracts these two sources by merging them together into one virtual source. \ //! It also handles synchronisation between the local cache and the server. +pub mod traits; + pub mod calendar; pub use calendar::Calendar; mod task; diff --git a/src/traits.rs b/src/traits.rs index 6d530ef..2fc9e38 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -1,49 +1,16 @@ -//! This module provides CalDAV data sources and utilities - -/* use std::error::Error; +use async_trait::async_trait; +use crate::Calendar; -/// A Caldav data source -pub struct DataSource { - client: Option, +#[async_trait] +pub trait CalDavSource { + /// Returns the current calendars that this source contains + /// This function may trigger an update (that can be a long process, or that can even fail, e.g. in case of a remote server) + async fn get_calendars(&self) -> Result<&Vec, Box>; - calendars: Vec + /// Returns the current calendars that this source contains + /// This function may trigger an update (that can be a long process, or that can even fail, e.g. in case of a remote server) + async fn get_calendars_mut(&mut self) -> Result, Box>; } - -impl DataSource { - /// Create a new data source - pub fn new() -> Self { - Self{ - client: None, - calendars: Vec::new(), - } - } - - /// Tell this data source what the source server is - pub fn set_server(&mut self, url: String, username: String, password: String) -> Result<(), Box> { - self.client = Some(Client::new(url, username, password)?); - Ok(()) - } - - /// Update the local database with info from the Client - pub fn fetch_from_server(&mut self) { - // TODO: how to handle conflicts? - } - - pub fn update_changes_to_server(&self) { - - } - - // TODO: the API should force calling fetch_from_server before - pub fn calendars(&self) -> Vec<&Calendar> { - // TODO: what happens when a user has a reference, which is modified/updated from the server? Conflict mut/not mut? - // TODO: how can the user modify Tasks from a non-mut reference? - self.calendars - .iter() - .collect() - } -} - -*/