feat: initialize a utils lib with config functions handling config files in local and standard OS directories
This commit is contained in:
9
crates/utils/Cargo.toml
Normal file
9
crates/utils/Cargo.toml
Normal file
@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "utils"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0"
|
||||
directories = "5.0"
|
||||
dotenv = "0.15"
|
48
crates/utils/src/config.rs
Normal file
48
crates/utils/src/config.rs
Normal file
@ -0,0 +1,48 @@
|
||||
use std::{env, path::PathBuf};
|
||||
|
||||
use anyhow::{bail, Context, Result};
|
||||
use directories::ProjectDirs;
|
||||
use dotenv::from_path;
|
||||
|
||||
const CONFIG_FILE_NAME: &str = ".env";
|
||||
|
||||
pub fn get_config_dirs() -> Vec<PathBuf> {
|
||||
let mut config_dirs = vec![
|
||||
PathBuf::from(""), // Current directory
|
||||
];
|
||||
if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") {
|
||||
config_dirs.push(PathBuf::from(manifest_dir));
|
||||
}
|
||||
if let Some(proj_dirs) = ProjectDirs::from("org", "P4pillon", "Krys4lide") {
|
||||
config_dirs.push(proj_dirs.config_dir().to_path_buf());
|
||||
}
|
||||
config_dirs
|
||||
}
|
||||
|
||||
pub fn get_config_files() -> Result<Vec<PathBuf>> {
|
||||
let config_dirs = get_config_dirs();
|
||||
let mut config_files = Vec::new();
|
||||
for config_dir in config_dirs.iter() {
|
||||
let config_file = config_dir.join(CONFIG_FILE_NAME);
|
||||
if config_file.exists() {
|
||||
config_files.push(config_file);
|
||||
}
|
||||
}
|
||||
if config_files.is_empty() {
|
||||
bail!(
|
||||
"No config file {CONFIG_FILE_NAME} found in the following directories: {config_dirs:#?}"
|
||||
);
|
||||
}
|
||||
Ok(config_files)
|
||||
}
|
||||
|
||||
pub fn load_config() -> Result<()> {
|
||||
let config_files = get_config_files()?;
|
||||
// Load the first config file found
|
||||
// TODO: add a verbose log to list all config files found
|
||||
println!(
|
||||
"DEBUG: Config files found (1st loaded): {:#?}",
|
||||
config_files
|
||||
);
|
||||
from_path(config_files[0].as_path()).context("Failed to load config file")
|
||||
}
|
1
crates/utils/src/lib.rs
Normal file
1
crates/utils/src/lib.rs
Normal file
@ -0,0 +1 @@
|
||||
pub mod config;
|
Reference in New Issue
Block a user