diff options
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/rust/main.rs | 18 | ||||
| -rw-r--r-- | src/main/rust/store/mod.rs | 32 | ||||
| -rw-r--r-- | src/main/rust/store/sqlite.rs | 48 |
3 files changed, 96 insertions, 2 deletions
diff --git a/src/main/rust/main.rs b/src/main/rust/main.rs index e231aae..0805796 100644 --- a/src/main/rust/main.rs +++ b/src/main/rust/main.rs @@ -1,3 +1,5 @@ +pub mod store; + use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind}; use miette::{Diagnostic, IntoDiagnostic, Result}; use ratatui::{ @@ -9,10 +11,12 @@ use ratatui::{ text::{Line, Text}, widgets::{Block, Paragraph, Widget}, }; +use store::{Context, Store}; use thiserror::Error; -#[derive(Debug, Default)] +#[derive(Default)] pub struct App { + context: Context, counter: u8, exit: bool, } @@ -27,10 +31,20 @@ pub struct OverflowError { #[cfg(not(tarpaulin_include))] fn main() -> Result<()> { - ratatui::run(|term| App::default().run(term)) + ratatui::run(|term| App::default().init_context()?.run(term)) } impl App { + // Initializes context + pub fn init_context(&mut self) -> Result<&mut Self> { + match &mut self.context { + Context::SQLite(s) => { + s.init()?; + } + } + Ok(self) + } + /// runs the application's main loop until the user quits #[cfg(not(tarpaulin_include))] pub fn run(&mut self, terminal: &mut DefaultTerminal) -> Result<()> { diff --git a/src/main/rust/store/mod.rs b/src/main/rust/store/mod.rs new file mode 100644 index 0000000..42f1809 --- /dev/null +++ b/src/main/rust/store/mod.rs @@ -0,0 +1,32 @@ +pub mod sqlite; + +use miette::Result; + +pub enum Context { + SQLite(sqlite::SQLite), +} + +impl Default for Context { + fn default() -> Self { + Context::SQLite(sqlite::SQLite::default()) + } +} + +pub trait Store { + fn init(&mut self) -> Result<()>; +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn context_default() { + let context = Context::default(); + + let res = match context { + Context::SQLite(_) => true, + }; + assert!(res); + } +} diff --git a/src/main/rust/store/sqlite.rs b/src/main/rust/store/sqlite.rs new file mode 100644 index 0000000..734c635 --- /dev/null +++ b/src/main/rust/store/sqlite.rs @@ -0,0 +1,48 @@ +use crate::store::Store; +use miette::{IntoDiagnostic, Result}; +use sqlite::Connection; + +pub struct SQLite { + location: String, + connection: Option<Connection>, +} + +impl Default for SQLite { + fn default() -> Self { + SQLite { + location: ":memory:".into(), + connection: Option::None, + } + } +} + +impl Store for SQLite { + fn init(&mut self) -> Result<()> { + let conn_path = self.location.clone(); + self.connection = sqlite::open(conn_path).into_diagnostic().ok(); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn sqlite_default() { + let context = SQLite::default(); + + assert_eq!(context.location, ":memory:"); + assert!(context.connection.is_none()); + } + + #[test] + fn sqlite_init() { + let mut context = SQLite::default(); + + let res = context.init(); + + assert!(res.is_ok()); + assert!(context.connection.is_some()); + } +} |
