Add config file parsing
Use the `serde` and `toml` crates to handle config file parsing.
This commit is contained in:
parent
665015c296
commit
d37f31dd8a
5 changed files with 160 additions and 12 deletions
84
Cargo.lock
generated
84
Cargo.lock
generated
|
@ -160,6 +160,12 @@ dependencies = [
|
||||||
"slab",
|
"slab",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.12.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hostname"
|
name = "hostname"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
|
@ -188,6 +194,16 @@ dependencies = [
|
||||||
"unicode-normalization",
|
"unicode-normalization",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "1.9.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"hashbrown",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "instant"
|
name = "instant"
|
||||||
version = "0.1.12"
|
version = "0.1.12"
|
||||||
|
@ -315,6 +331,15 @@ dependencies = [
|
||||||
"minimal-lexical",
|
"minimal-lexical",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nom8"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nu-ansi-term"
|
name = "nu-ansi-term"
|
||||||
version = "0.46.0"
|
version = "0.46.0"
|
||||||
|
@ -561,6 +586,29 @@ name = "serde"
|
||||||
version = "1.0.152"
|
version = "1.0.152"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
|
checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.152"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_spanned"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2c68e921cef53841b8925c2abadd27c9b891d9613bdc43d6b823062866df38e8"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sharded-slab"
|
name = "sharded-slab"
|
||||||
|
@ -672,6 +720,40 @@ version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
|
checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4fb9d890e4dc9298b70f740f615f2e05b9db37dce531f6b24fb77ac993f9f217"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"toml_edit",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_datetime"
|
||||||
|
version = "0.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_edit"
|
||||||
|
version = "0.18.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "729bfd096e40da9c001f778f5cdecbd2957929a24e10e5883d9392220a751581"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap",
|
||||||
|
"nom8",
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing"
|
name = "tracing"
|
||||||
version = "0.1.37"
|
version = "0.1.37"
|
||||||
|
@ -777,7 +859,9 @@ dependencies = [
|
||||||
"diesel",
|
"diesel",
|
||||||
"lettre",
|
"lettre",
|
||||||
"log",
|
"log",
|
||||||
|
"serde",
|
||||||
"time",
|
"time",
|
||||||
|
"toml",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
|
|
@ -17,3 +17,5 @@ tracing-subscriber = "0.3"
|
||||||
time = "0.3"
|
time = "0.3"
|
||||||
lettre = { version = "0.10", features = ["tracing"] }
|
lettre = { version = "0.10", features = ["tracing"] }
|
||||||
diesel = { version = "2", features = ["postgres", "r2d2", "time"] }
|
diesel = { version = "2", features = ["postgres", "r2d2", "time"] }
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
toml = "0.6"
|
||||||
|
|
6
config.toml
Normal file
6
config.toml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[database]
|
||||||
|
# host = "localhost"
|
||||||
|
# port = 5432
|
||||||
|
# name = "whakarite"
|
||||||
|
# user = "whakarite"
|
||||||
|
pass = "whakarite"
|
47
src/config.rs
Normal file
47
src/config.rs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
fn default_host() -> String {
|
||||||
|
"localhost".to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
const fn default_port() -> u16 {
|
||||||
|
5432
|
||||||
|
}
|
||||||
|
|
||||||
|
fn default_name() -> String {
|
||||||
|
"whakarite".to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn default_user() -> String {
|
||||||
|
"whakarite".to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(deny_unknown_fields)]
|
||||||
|
pub struct Database {
|
||||||
|
/// Host of the database
|
||||||
|
#[serde(default = "default_host")]
|
||||||
|
pub host: String,
|
||||||
|
|
||||||
|
/// Port of the database
|
||||||
|
#[serde(default = "default_port")]
|
||||||
|
pub port: u16,
|
||||||
|
|
||||||
|
/// Name of the database
|
||||||
|
#[serde(default = "default_name")]
|
||||||
|
pub name: String,
|
||||||
|
|
||||||
|
/// Name of the user to connect to the database
|
||||||
|
#[serde(default = "default_user")]
|
||||||
|
pub user: String,
|
||||||
|
|
||||||
|
/// Password of the user to connect to the database
|
||||||
|
pub pass: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(deny_unknown_fields)]
|
||||||
|
pub struct Config {
|
||||||
|
/// Database configuration
|
||||||
|
pub database: Database,
|
||||||
|
}
|
33
src/main.rs
33
src/main.rs
|
@ -8,16 +8,18 @@ use std::{env, thread::park_timeout};
|
||||||
use time::{Duration, OffsetDateTime};
|
use time::{Duration, OffsetDateTime};
|
||||||
use tracing::{debug, info, trace};
|
use tracing::{debug, info, trace};
|
||||||
|
|
||||||
|
mod config;
|
||||||
mod models;
|
mod models;
|
||||||
mod schema;
|
mod schema;
|
||||||
|
|
||||||
|
use config::Config;
|
||||||
use models::{NewReminder, Reminder};
|
use models::{NewReminder, Reminder};
|
||||||
|
|
||||||
fn remind(
|
fn remind(
|
||||||
db: &mut PooledConnection<ConnectionManager<PgConnection>>,
|
db: &mut PooledConnection<ConnectionManager<PgConnection>>,
|
||||||
mailer: &SmtpTransport,
|
mailer: &SmtpTransport,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
debug!("executing remind run");
|
info!("checking for reminders");
|
||||||
|
|
||||||
for reminder in schema::reminders::dsl::reminders
|
for reminder in schema::reminders::dsl::reminders
|
||||||
.filter(schema::reminders::executed.is_null())
|
.filter(schema::reminders::executed.is_null())
|
||||||
|
@ -40,16 +42,12 @@ fn remind(
|
||||||
|
|
||||||
debug!("email sent to {}", reminder.receiver);
|
debug!("email sent to {}", reminder.receiver);
|
||||||
} else {
|
} else {
|
||||||
info!(
|
let duration = reminder.planned - OffsetDateTime::now_utc();
|
||||||
"parking reminder for {:?}",
|
info!(?duration, "parking reminder");
|
||||||
reminder.planned - OffsetDateTime::now_utc(),
|
|
||||||
);
|
|
||||||
|
|
||||||
park_timeout(<std::time::Duration>::try_from(
|
park_timeout(<std::time::Duration>::try_from(duration)?);
|
||||||
reminder.planned - OffsetDateTime::now_utc(),
|
|
||||||
)?);
|
|
||||||
}
|
}
|
||||||
// Check for another remnd job if none dont loop forever
|
// Check for another remind job if none dont loop forever
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -64,9 +62,20 @@ fn main() -> Result<()> {
|
||||||
env!("CARGO_PKG_VERSION")
|
env!("CARGO_PKG_VERSION")
|
||||||
);
|
);
|
||||||
|
|
||||||
let db_pool = Pool::builder().build(ConnectionManager::<PgConnection>::new(
|
let config_path = "./config.toml";
|
||||||
"postgresql://whakarite:whakarite@localhost/whakarite",
|
|
||||||
))?;
|
let config: Config = toml::from_str(&std::fs::read_to_string(config_path)?)?;
|
||||||
|
|
||||||
|
trace!(?config, config_path, "loaded config");
|
||||||
|
|
||||||
|
let db_pool = Pool::builder().build(ConnectionManager::<PgConnection>::new(format!(
|
||||||
|
"postgresql://{}:{}@{}:{}/{}",
|
||||||
|
config.database.user,
|
||||||
|
config.database.pass,
|
||||||
|
config.database.host,
|
||||||
|
config.database.port,
|
||||||
|
config.database.name
|
||||||
|
)))?;
|
||||||
|
|
||||||
let test_reminder = NewReminder {
|
let test_reminder = NewReminder {
|
||||||
created: OffsetDateTime::now_utc(),
|
created: OffsetDateTime::now_utc(),
|
||||||
|
|
Loading…
Reference in a new issue