add configfile stuff
This commit is contained in:
parent
efec2e670f
commit
a46a2e8847
6 changed files with 33 additions and 10 deletions
2
.env
2
.env
|
@ -1 +1 @@
|
||||||
DATABASE_URL=sqlite://${HOME}/.what2watch.db
|
DATABASE_URL=sqlite://${HOME}/.local/share/what2watch/what2watch.db
|
||||||
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
/target
|
/target
|
||||||
/libjulid.so
|
/libjulid.so
|
||||||
ww-style
|
ww-style
|
||||||
|
*.db
|
||||||
|
|
10
Cargo.lock
generated
10
Cargo.lock
generated
|
@ -635,6 +635,15 @@ dependencies = [
|
||||||
"dirs-sys",
|
"dirs-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dirs"
|
||||||
|
version = "5.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
|
||||||
|
dependencies = [
|
||||||
|
"dirs-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dirs-sys"
|
name = "dirs-sys"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
|
@ -2877,6 +2886,7 @@ dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap",
|
"clap",
|
||||||
"confy",
|
"confy",
|
||||||
|
"dirs",
|
||||||
"http 1.0.0",
|
"http 1.0.0",
|
||||||
"julid-rs",
|
"julid-rs",
|
||||||
"justerror",
|
"justerror",
|
||||||
|
|
|
@ -19,6 +19,7 @@ axum-macros = "0.4"
|
||||||
chrono = { version = "0.4", default-features = false, features = ["std", "clock"] }
|
chrono = { version = "0.4", default-features = false, features = ["std", "clock"] }
|
||||||
clap = { version = "4", features = ["derive", "env", "unicode", "suggestions", "usage"] }
|
clap = { version = "4", features = ["derive", "env", "unicode", "suggestions", "usage"] }
|
||||||
confy = "0.6"
|
confy = "0.6"
|
||||||
|
dirs = "5"
|
||||||
http = "1"
|
http = "1"
|
||||||
julid-rs = "1"
|
julid-rs = "1"
|
||||||
justerror = "1"
|
justerror = "1"
|
||||||
|
|
21
src/conf.rs
21
src/conf.rs
|
@ -1,33 +1,42 @@
|
||||||
use std::ffi::OsString;
|
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
pub const APP_NAME: &str = "what2watch";
|
pub const APP_NAME: &str = "what2watch";
|
||||||
|
const CONFIG_NAME: Option<&str> = Some("config");
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub base_url: String,
|
pub base_url: String,
|
||||||
pub db_file: OsString,
|
pub db_file: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Config {
|
impl Default for Config {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
|
let mut datadir = dirs::data_dir().unwrap();
|
||||||
|
datadir.push(APP_NAME);
|
||||||
|
datadir.push("what2watch.db");
|
||||||
Self {
|
Self {
|
||||||
base_url: "http://localhost:3000".into(),
|
base_url: "http://localhost:3000".into(),
|
||||||
db_file: "what2watch.db".into(),
|
db_file: datadir.as_os_str().to_string_lossy().to_string(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
pub fn get() -> Self {
|
pub fn get() -> Self {
|
||||||
let config: Config = confy::load(APP_NAME, None).unwrap_or_else(|e| {
|
let config: Config = confy::load(APP_NAME, CONFIG_NAME).unwrap_or_else(|e| {
|
||||||
tracing::debug!("Could not load {APP_NAME} config, got error {e}");
|
tracing::debug!("Could not load {APP_NAME} config, got error {e}");
|
||||||
Default::default()
|
Default::default()
|
||||||
});
|
});
|
||||||
confy::store(APP_NAME, None, config.clone()).unwrap_or_else(|e| {
|
confy::store(APP_NAME, CONFIG_NAME, config.clone()).unwrap_or_else(|e| {
|
||||||
tracing::debug!("Could not store {APP_NAME} config, got error {e}");
|
tracing::debug!("Could not store {APP_NAME} config, got error {e}");
|
||||||
});
|
});
|
||||||
|
tracing::info!("Loading config from {}", cpath());
|
||||||
config
|
config
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn cpath() -> String {
|
||||||
|
confy::get_configuration_file_path(APP_NAME, CONFIG_NAME)
|
||||||
|
.map(|p| p.as_os_str().to_str().unwrap().to_string())
|
||||||
|
.expect("couldn't get the path to the configuration file")
|
||||||
|
}
|
||||||
|
|
|
@ -15,9 +15,11 @@ pub fn get_db_pool() -> SqlitePool {
|
||||||
std::env::var("DATABASE_FILE").unwrap_or_else(|_| {
|
std::env::var("DATABASE_FILE").unwrap_or_else(|_| {
|
||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
{
|
{
|
||||||
let home =
|
let f = crate::conf::Config::get().db_file;
|
||||||
std::env::var("HOME").expect("Could not determine $HOME for finding db file");
|
let p = std::path::Path::new(&f);
|
||||||
format!("{home}/.what2watch.db")
|
let p = p.parent().unwrap();
|
||||||
|
std::fs::create_dir_all(p).expect("couldn't create data dir");
|
||||||
|
f
|
||||||
}
|
}
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue