diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/tosin-admin.rs | 3 | ||||
-rw-r--r-- | src/cli/migrate.rs | 19 | ||||
-rw-r--r-- | src/cli/mod.rs | 9 | ||||
-rw-r--r-- | src/cli/run_server.rs | 4 | ||||
-rw-r--r-- | src/db/backend.rs | 19 | ||||
-rw-r--r-- | src/settings.rs | 10 |
6 files changed, 50 insertions, 14 deletions
diff --git a/src/bin/tosin-admin.rs b/src/bin/tosin-admin.rs index 6408337..e519d50 100644 --- a/src/bin/tosin-admin.rs +++ b/src/bin/tosin-admin.rs @@ -10,6 +10,7 @@ const TOSIN_DEPENDENCY: &str = concat!(r#"tosin = { path = ""#, env!("CARGO_MANI const PROJECT_MAIN: &str = r#" use tosin::Settings; use tosin::contrib::admin; +use tosin::db::backend::Connectable; use tosin::urls::{UrlMap, url_map}; fn urls() -> UrlMap { @@ -18,7 +19,7 @@ fn urls() -> UrlMap { } } -fn settings() -> Settings { +fn settings() -> Settings<impl Connectable> { Settings { ..Settings::default() } diff --git a/src/cli/migrate.rs b/src/cli/migrate.rs new file mode 100644 index 0000000..4b5123a --- /dev/null +++ b/src/cli/migrate.rs @@ -0,0 +1,19 @@ +use structopt::StructOpt; + +use crate::{Settings, UrlMap, db::backend::{Connectable, Connection}}; + +#[derive(StructOpt)] +/// Perform database migrations +pub struct Migrate { +} + +impl Migrate { + pub fn execute(self, _urls: UrlMap, settings: Settings<impl Connectable>) { + let database = settings.database; + let connection = database.connect().unwrap(); + + let migration_table_vibe_check = connection.transaction::<(), diesel::result::Error, _>(|| { + todo!() + }); + } +} diff --git a/src/cli/mod.rs b/src/cli/mod.rs index c656c1c..a11fd48 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -1,23 +1,26 @@ use structopt::StructOpt; -use crate::{Settings, UrlMap}; +use crate::{Settings, UrlMap, db::backend::Connectable}; +mod migrate; mod run_server; #[derive(StructOpt)] enum Command { + Migrate(migrate::Migrate), RunServer(run_server::RunServer), } impl Command { - fn execute(self, urls: UrlMap, settings: Settings) { + fn execute(self, urls: UrlMap, settings: Settings<impl Connectable>) { match self { + Command::Migrate(command) => command.execute(urls, settings), Command::RunServer(command) => command.execute(urls, settings), } } } -pub fn main(urls: UrlMap, settings: Settings) { +pub fn main(urls: UrlMap, settings: Settings<impl Connectable>) { let command = Command::from_args(); command.execute(urls, settings); } diff --git a/src/cli/run_server.rs b/src/cli/run_server.rs index 242c824..66e6fe1 100644 --- a/src/cli/run_server.rs +++ b/src/cli/run_server.rs @@ -1,6 +1,6 @@ use structopt::StructOpt; -use crate::{Settings, UrlMap}; +use crate::{Settings, UrlMap, db::backend::Connectable}; #[derive(StructOpt)] /// Run an HTTP server @@ -11,7 +11,7 @@ pub struct RunServer { } impl RunServer { - pub fn execute(self, urls: UrlMap, _settings: Settings) { + pub fn execute(self, urls: UrlMap, _settings: Settings<impl Connectable>) { println!("Starting server at http://127.0.0.1:{}/", self.port); let server_task = warp::serve(urls).run(([127, 0, 0, 1], self.port)); diff --git a/src/db/backend.rs b/src/db/backend.rs index 5ae4de2..b75d5ca 100644 --- a/src/db/backend.rs +++ b/src/db/backend.rs @@ -1,5 +1,18 @@ -pub enum DbBackend { - Sqlite { - db_file: &'static str, +pub use diesel::connection::Connection; + +pub trait Connectable { + type Connection: Connection; + fn connect(&self) -> diesel::ConnectionResult<Self::Connection>; +} + +pub struct Sqlite { + pub db_file: &'static str, +} + +impl Connectable for Sqlite { + type Connection = diesel::sqlite::SqliteConnection; + + fn connect(&self) -> diesel::ConnectionResult<Self::Connection> { + Self::Connection::establish(self.db_file) } } diff --git a/src/settings.rs b/src/settings.rs index 37a3395..4b140a6 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -1,15 +1,15 @@ -use crate::db::backend::DbBackend; +use crate::db::backend::{self, Connectable}; -pub struct Settings { +pub struct Settings<C: Connectable> { pub installed_apps: &'static [&'static crate::apps::AppConfig], - pub database: DbBackend, + pub database: C, } -impl Default for Settings { +impl Default for Settings<backend::Sqlite> { fn default() -> Self { Self { installed_apps: &[], - database: DbBackend::Sqlite { + database: backend::Sqlite { db_file: "db.sqlite3", }, } |