aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml10
-rw-r--r--examples/tutorial01/main.rs3
-rw-r--r--examples/tutorial02/main.rs3
-rw-r--r--src/bin/tosin-admin.rs7
-rw-r--r--src/cli/make_migrations.rs4
-rw-r--r--src/cli/migrate.rs7
-rw-r--r--src/cli/mod.rs6
-rw-r--r--src/cli/run_server.rs4
-rw-r--r--src/db/backend.rs27
-rw-r--r--src/db/backend/mod.rs7
-rw-r--r--src/db/backend/sqlite.rs22
-rw-r--r--src/db/migration/change.rs8
-rw-r--r--src/db/migration/mod.rs8
-rw-r--r--src/settings.rs12
-rw-r--r--tests/tutorial/mod.rs13
15 files changed, 68 insertions, 73 deletions
diff --git a/Cargo.toml b/Cargo.toml
index ddb4cdb..5e0cf6f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,12 +7,11 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-barrel = { version = "0.6.5", features = ["sqlite3"] }
+barrel = { version = "0.6.5" }
chrono = { version = "0.4", features = ["clock"] }
-diesel = { version = "1.4.4", features = ["sqlite", "chrono"] }
+diesel = { version = "1.4.4", features = ["chrono"] }
hyper = { version = "0.14", features = ["full"] }
-# TODO not this
-libsqlite3-sys = { version = "0.22.2", features = ["bundled-windows"] }
+libsqlite3-sys = { version = "0.22.2", features = ["bundled-windows"], optional = true }
quote = "1.0"
structopt = "0.3.21"
syn = { version = "1.0", features = ["full", "extra-traits"] }
@@ -22,3 +21,6 @@ warp = "0.3"
[dev-dependencies]
rand = "0.8.3"
+
+[features]
+sqlite = ["barrel/sqlite3", "diesel/sqlite", "libsqlite3-sys"]
diff --git a/examples/tutorial01/main.rs b/examples/tutorial01/main.rs
index af2f14d..47623e6 100644
--- a/examples/tutorial01/main.rs
+++ b/examples/tutorial01/main.rs
@@ -2,7 +2,6 @@
extern crate diesel;
use tosin::contrib::admin;
-use tosin::db::backend::Connectable;
use tosin::urls::{url_map, UrlMap};
use tosin::Settings;
@@ -15,7 +14,7 @@ fn urls() -> UrlMap {
}
}
-fn settings() -> Settings<impl Connectable> {
+fn settings() -> Settings {
Settings {
..Settings::default()
}
diff --git a/examples/tutorial02/main.rs b/examples/tutorial02/main.rs
index 7c244dd..5d78e5b 100644
--- a/examples/tutorial02/main.rs
+++ b/examples/tutorial02/main.rs
@@ -2,7 +2,6 @@
extern crate diesel;
use tosin::contrib::admin;
-use tosin::db::backend::Connectable;
use tosin::urls::{url_map, UrlMap};
use tosin::Settings;
@@ -15,7 +14,7 @@ fn urls() -> UrlMap {
}
}
-fn settings() -> Settings<impl Connectable> {
+fn settings() -> Settings {
Settings {
installed_apps: &[&polls::APP, &admin::APP],
..Settings::default()
diff --git a/src/bin/tosin-admin.rs b/src/bin/tosin-admin.rs
index b4fc1d4..0f19795 100644
--- a/src/bin/tosin-admin.rs
+++ b/src/bin/tosin-admin.rs
@@ -9,15 +9,14 @@ use structopt::StructOpt;
const TOSIN_DEPENDENCY: &str = concat!(
r#"tosin = { path = '"#,
env!("CARGO_MANIFEST_DIR"),
- r#"' }
-diesel = { version = "1.4.4", features = ["sqlite"] }"#
+ r#"', features = ["sqlite"] }
+diesel = "1.4.4""#
);
const PROJECT_MAIN: &str = r#"
#[macro_use]
extern crate diesel;
use tosin::contrib::admin;
-use tosin::db::backend::Connectable;
use tosin::urls::{url_map, UrlMap};
use tosin::Settings;
@@ -27,7 +26,7 @@ fn urls() -> UrlMap {
}
}
-fn settings() -> Settings<impl Connectable> {
+fn settings() -> Settings {
Settings {
..Settings::default()
}
diff --git a/src/cli/make_migrations.rs b/src/cli/make_migrations.rs
index b0cd341..e0653b6 100644
--- a/src/cli/make_migrations.rs
+++ b/src/cli/make_migrations.rs
@@ -7,7 +7,7 @@ use structopt::StructOpt;
use crate::db::migration::{CreateModelOption, DatabaseChange, Migration};
use crate::db::models::{Field, ModelMeta};
-use crate::{db::backend::Connectable, Settings, UrlMap};
+use crate::{Settings, UrlMap};
#[derive(StructOpt)]
/// Generate migrations
@@ -101,7 +101,7 @@ impl From<&[Migration]> for AppTablesState {
}
impl MakeMigrations {
- pub fn execute(self, _urls: UrlMap, settings: Settings<impl Connectable>) {
+ pub fn execute(self, _urls: UrlMap, settings: Settings) {
for app in settings.installed_apps {
let expected_table_state = AppTablesState::from(app.models);
let actual_table_state = AppTablesState::from(app.migrations);
diff --git a/src/cli/migrate.rs b/src/cli/migrate.rs
index acc59d3..4085fe1 100644
--- a/src/cli/migrate.rs
+++ b/src/cli/migrate.rs
@@ -1,6 +1,5 @@
use structopt::StructOpt;
-use crate::db::backend::Connectable;
use crate::db::migration::{CreateModelOption, DatabaseChange};
use crate::db::models::Field;
use crate::{Settings, UrlMap};
@@ -29,15 +28,15 @@ const CREATE_MIGRATION_TABLE: DatabaseChange = DatabaseChange::CreateModel {
};
impl Migrate {
- pub fn execute<C: Connectable>(self, _urls: UrlMap, settings: Settings<C>) {
+ pub fn execute(self, _urls: UrlMap, settings: Settings) {
let database = settings.database;
let connection = database.connect().unwrap();
- CREATE_MIGRATION_TABLE.apply::<C>("tosin_meta", &connection);
+ CREATE_MIGRATION_TABLE.apply("tosin_meta", &connection);
for app in settings.installed_apps {
for migration in app.migrations {
- migration.apply::<C>(app.name, &connection);
+ migration.apply(app.name, &connection);
}
}
}
diff --git a/src/cli/mod.rs b/src/cli/mod.rs
index 5bff8ae..347430c 100644
--- a/src/cli/mod.rs
+++ b/src/cli/mod.rs
@@ -1,6 +1,6 @@
use structopt::StructOpt;
-use crate::{db::backend::Connectable, Settings, UrlMap};
+use crate::{Settings, UrlMap};
mod make_migrations;
mod migrate;
@@ -14,7 +14,7 @@ enum Command {
}
impl Command {
- fn execute(self, urls: UrlMap, settings: Settings<impl Connectable>) {
+ fn execute(self, urls: UrlMap, settings: Settings) {
match self {
Command::MakeMigrations(command) => command.execute(urls, settings),
Command::Migrate(command) => command.execute(urls, settings),
@@ -23,7 +23,7 @@ impl Command {
}
}
-pub fn main(urls: UrlMap, settings: Settings<impl Connectable>) {
+pub fn main(urls: UrlMap, settings: Settings) {
let command = Command::from_args();
command.execute(urls, settings);
}
diff --git a/src/cli/run_server.rs b/src/cli/run_server.rs
index d20ac14..242c824 100644
--- a/src/cli/run_server.rs
+++ b/src/cli/run_server.rs
@@ -1,6 +1,6 @@
use structopt::StructOpt;
-use crate::{db::backend::Connectable, Settings, UrlMap};
+use crate::{Settings, UrlMap};
#[derive(StructOpt)]
/// Run an HTTP server
@@ -11,7 +11,7 @@ pub struct RunServer {
}
impl RunServer {
- pub fn execute(self, urls: UrlMap, _settings: Settings<impl Connectable>) {
+ pub fn execute(self, urls: UrlMap, _settings: Settings) {
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
deleted file mode 100644
index 5950747..0000000
--- a/src/db/backend.rs
+++ /dev/null
@@ -1,27 +0,0 @@
-use barrel::backend::SqlGenerator;
-pub use diesel::connection::Connection;
-
-pub trait UsableBackend: diesel::backend::Backend where *const str: diesel::deserialize::FromSql<diesel::sql_types::Text, Self> {}
-impl UsableBackend for diesel::sqlite::Sqlite {}
-
-pub trait UsableConnection: Connection where <Self as Connection>::Backend: UsableBackend {}
-impl UsableConnection for diesel::sqlite::SqliteConnection {}
-
-pub trait Connectable {
- type Connection: UsableConnection;
- type SqlGenerator: SqlGenerator;
- fn connect(&self) -> diesel::ConnectionResult<Self::Connection>;
-}
-
-pub struct Sqlite {
- pub db_file: &'static str,
-}
-
-impl Connectable for Sqlite {
- type Connection = diesel::sqlite::SqliteConnection;
- type SqlGenerator = barrel::backend::Sqlite;
-
- fn connect(&self) -> diesel::ConnectionResult<Self::Connection> {
- Self::Connection::establish(self.db_file)
- }
-}
diff --git a/src/db/backend/mod.rs b/src/db/backend/mod.rs
new file mode 100644
index 0000000..b266f1e
--- /dev/null
+++ b/src/db/backend/mod.rs
@@ -0,0 +1,7 @@
+#[cfg(feature = "sqlite")]
+mod sqlite;
+#[cfg(feature = "sqlite")]
+pub use sqlite::*;
+
+#[cfg(not(feature = "sqlite"))]
+compile_error!("pick a backend pls");
diff --git a/src/db/backend/sqlite.rs b/src/db/backend/sqlite.rs
new file mode 100644
index 0000000..002d0d3
--- /dev/null
+++ b/src/db/backend/sqlite.rs
@@ -0,0 +1,22 @@
+use diesel::connection::Connection as _;
+
+pub use barrel::backend::Sqlite as SqlGenerator;
+pub use diesel::sqlite::SqliteConnection as Connection;
+
+pub struct Database {
+ pub db_file: &'static str,
+}
+
+impl Database {
+ pub fn connect(&self) -> diesel::ConnectionResult<Connection> {
+ Connection::establish(self.db_file)
+ }
+}
+
+impl Default for Database {
+ fn default() -> Self {
+ Self {
+ db_file: "db.sqlite3",
+ }
+ }
+}
diff --git a/src/db/migration/change.rs b/src/db/migration/change.rs
index 8bb8bf6..a07ef24 100644
--- a/src/db/migration/change.rs
+++ b/src/db/migration/change.rs
@@ -1,6 +1,6 @@
-use diesel::Connection;
+use diesel::Connection as _;
-use crate::db::backend::Connectable;
+use crate::db::backend::{Connection, SqlGenerator};
use crate::db::models::Field;
pub enum DatabaseChange {
@@ -12,7 +12,7 @@ pub enum DatabaseChange {
}
impl DatabaseChange {
- pub fn apply<C: Connectable>(&self, app_name: &str, connection: &C::Connection) {
+ pub fn apply(&self, app_name: &str, connection: &Connection) {
use barrel::{types, Migration, Table};
match self {
@@ -55,7 +55,7 @@ impl DatabaseChange {
m.create_table(table_name, callback);
}
- connection.execute(&m.make::<C::SqlGenerator>()).unwrap();
+ connection.execute(&m.make::<SqlGenerator>()).unwrap();
}
}
}
diff --git a/src/db/migration/mod.rs b/src/db/migration/mod.rs
index 839608f..e6b3266 100644
--- a/src/db/migration/mod.rs
+++ b/src/db/migration/mod.rs
@@ -1,8 +1,8 @@
pub use tosin_macros::gather_migrations as gather;
-use diesel::{result::Error as DieselError, Connection};
+use diesel::{result::Error as DieselError, Connection as _};
-use crate::db::backend::Connectable;
+use crate::db::backend::Connection;
mod change;
@@ -16,12 +16,12 @@ pub struct Migration {
}
impl Migration {
- pub fn apply<C: Connectable>(&self, app_name: &str, connection: &C::Connection) {
+ pub fn apply(&self, app_name: &str, connection: &Connection) {
// TODO prevent double-applying
connection
.transaction::<_, DieselError, _>(|| {
for change in self.changes {
- change.apply::<C>(app_name, connection);
+ change.apply(app_name, connection);
}
Ok(())
diff --git a/src/settings.rs b/src/settings.rs
index 4b140a6..0ae1136 100644
--- a/src/settings.rs
+++ b/src/settings.rs
@@ -1,17 +1,15 @@
-use crate::db::backend::{self, Connectable};
+use crate::db::backend::Database;
-pub struct Settings<C: Connectable> {
+pub struct Settings {
pub installed_apps: &'static [&'static crate::apps::AppConfig],
- pub database: C,
+ pub database: Database,
}
-impl Default for Settings<backend::Sqlite> {
+impl Default for Settings {
fn default() -> Self {
Self {
installed_apps: &[],
- database: backend::Sqlite {
- db_file: "db.sqlite3",
- },
+ database: Database::default(),
}
}
}
diff --git a/tests/tutorial/mod.rs b/tests/tutorial/mod.rs
index f101283..aeb3135 100644
--- a/tests/tutorial/mod.rs
+++ b/tests/tutorial/mod.rs
@@ -137,7 +137,6 @@ pub fn urls() -> UrlMap {
extern crate diesel;
use tosin::contrib::admin;
-use tosin::db::backend::Connectable;
use tosin::urls::{url_map, UrlMap};
use tosin::Settings;
@@ -150,7 +149,7 @@ fn urls() -> UrlMap {
}
}
-fn settings() -> Settings<impl Connectable> {
+fn settings() -> Settings {
Settings {
..Settings::default()
}
@@ -208,7 +207,6 @@ pub fn step2() {
use tosin::Settings;
use tosin::contrib::admin;
-use tosin::db::backend::Connectable;
use tosin::urls::{UrlMap, url_map};
mod polls;
@@ -220,7 +218,7 @@ fn urls() -> UrlMap {
}
}
-fn settings() -> Settings<impl Connectable> {
+fn settings() -> Settings {
Settings {
installed_apps: &[
&admin::APP,
@@ -254,8 +252,8 @@ edition = "2018"
[dependencies]
chrono = "0.4"
-diesel = { version = "1.4.4", features = ["sqlite"] }
-tosin = { path = "../../.." }
+diesel = "1.4.4"
+tosin = { path = "../../..", features = ["sqlite"] }
"#,
)
.unwrap();
@@ -299,7 +297,6 @@ gather!();
use tosin::Settings;
use tosin::contrib::admin;
-use tosin::db::backend::Connectable;
use tosin::urls::{UrlMap, url_map};
mod polls;
@@ -311,7 +308,7 @@ fn urls() -> UrlMap {
}
}
-fn settings() -> Settings<impl Connectable> {
+fn settings() -> Settings {
Settings {
installed_apps: &[
&polls::APP,