summaryrefslogtreecommitdiffstats
path: root/src/db
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-11-03 15:57:42 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-11-03 17:46:51 +0100
commit2dc17040af03eea496b055d851d27c403dfc73f4 (patch)
treeb3ed5f2076cc607efe98fa188770a3caf2a1b769 /src/db
parentbba25b045ce2686a7ebad734f2c686d797e496d3 (diff)
Add DB connection establishing
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/db')
-rw-r--r--src/db/connection.rs67
-rw-r--r--src/db/mod.rs2
2 files changed, 69 insertions, 0 deletions
diff --git a/src/db/connection.rs b/src/db/connection.rs
new file mode 100644
index 0000000..4e338d0
--- /dev/null
+++ b/src/db/connection.rs
@@ -0,0 +1,67 @@
+use anyhow::Result;
+use anyhow::Error;
+use clap_v3::ArgMatches;
+use diesel::prelude::*;
+use diesel::pg::PgConnection;
+use getset::Getters;
+
+use crate::config::Configuration;
+
+#[derive(Debug, Getters)]
+pub struct DbConnectionConfig {
+ #[getset(get = "pub")]
+ database_host: String,
+
+ #[getset(get = "pub")]
+ database_port: String,
+
+ #[getset(get = "pub")]
+ database_user: String,
+
+ #[getset(get = "pub")]
+ database_password: String,
+
+ #[getset(get = "pub")]
+ database_name: String,
+}
+
+impl Into<String> for DbConnectionConfig {
+ fn into(self) -> String {
+ format!("postgres://{user}:{password}@{host}:{port}/{name}",
+ host = self.database_host,
+ port = self.database_port,
+ user = self.database_user,
+ password = self.database_password,
+ name = self.database_name)
+ }
+}
+
+pub fn parse_db_connection_config(config: &Configuration, cli: &ArgMatches) -> DbConnectionConfig {
+ fn find_value<F>(cli: &ArgMatches, key: &str, alternative: F) -> String
+ where F: FnOnce() -> String
+ {
+ cli.value_of(key).map(String::from).unwrap_or_else(alternative)
+ }
+
+ let database_host = find_value(cli, "database_host", || config.database_host().to_string());
+ let database_port = find_value(cli, "database_port", || config.database_port().to_string());
+ let database_user = find_value(cli, "database_user", || config.database_user().to_string());
+ let database_password = find_value(cli, "database_password", || config.database_password().to_string());
+ let database_name = find_value(cli, "database_name", || config.database_name().to_string());
+
+ DbConnectionConfig {
+ database_host,
+ database_port,
+ database_user,
+ database_password,
+ database_name,
+ }
+
+}
+
+pub fn establish_connection(conn_config: DbConnectionConfig) -> Result<PgConnection> {
+ let database_uri: String = conn_config.into();
+ debug!("Trying to connect to database: {}", database_uri);
+ PgConnection::establish(&database_uri).map_err(Error::from)
+}
+
diff --git a/src/db/mod.rs b/src/db/mod.rs
new file mode 100644
index 0000000..0b0387e
--- /dev/null
+++ b/src/db/mod.rs
@@ -0,0 +1,2 @@
+mod connection;
+pub use connection::*;