diff options
Diffstat (limited to 'src/app/store/mod.rs')
| -rw-r--r-- | src/app/store/mod.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/app/store/mod.rs b/src/app/store/mod.rs new file mode 100644 index 0000000..d038167 --- /dev/null +++ b/src/app/store/mod.rs @@ -0,0 +1,58 @@ +mod sqlite; + +use sqlite::{SQLiteStore}; +use miette::{Diagnostic, Result}; +use thiserror::Error; + +pub enum Context { + SQLite(SQLiteStore), +} + +#[derive(Debug, Diagnostic, Error)] +pub enum ContextError { + #[error("Data storage error")] + DataError(#[from] ::sqlite::Error), + #[error("Int conversion error")] + ConversionError(#[from] std::num::TryFromIntError), +} + +impl Default for Context { + fn default() -> Self { + Context::SQLite(SQLiteStore::default()) + } +} + +pub trait Store { + fn init(&mut self) -> Result<(), ContextError>; + fn get_counter(&self) -> Result<u8, ContextError>; + fn set_counter(&mut self, new_count: u8) -> Result<u8, ContextError>; +} + +impl Context { + pub fn unwrap_store(&mut self) -> &mut impl Store { + match self { + Context::SQLite(store) => store, + } + } + + pub fn get_store(&self) -> &impl Store { + match self { + Context::SQLite(store) => store, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn context_default() { + let context = Context::default(); + + let res = match context { + Context::SQLite(_) => true, + }; + assert!(res); + } +} |
