aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMelody Horn / boringcactus <melody@boringcactus.com>2021-06-16 12:36:47 -0600
committerMelody Horn / boringcactus <melody@boringcactus.com>2021-06-16 12:36:47 -0600
commit685b47247aad71468f190c42929ca6f0dce843fa (patch)
tree7adf64a4c00b9ca8893fab26367ec01a30e24ad9 /src
parent92bf14bb7cc0c10f67a9a67e7512138c15db6ec0 (diff)
downloadtosin-685b47247aad71468f190c42929ca6f0dce843fa.tar.gz
tosin-685b47247aad71468f190c42929ca6f0dce843fa.zip
make database backends generic
Diffstat (limited to 'src')
-rw-r--r--src/bin/tosin-admin.rs3
-rw-r--r--src/cli/migrate.rs19
-rw-r--r--src/cli/mod.rs9
-rw-r--r--src/cli/run_server.rs4
-rw-r--r--src/db/backend.rs19
-rw-r--r--src/settings.rs10
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",
},
}