From f56439c9c5de905df679e248abedc453826a630c Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Thu, 22 Aug 2024 20:40:12 +0200 Subject: [PATCH 1/2] feat: initialize a utils lib with config functions handling config files in local and standard OS directories --- .../.env.linux.example => .env.linux.example | 0 .../.env.win.example => .env.win.example | 0 .gitignore | 2 + Cargo.lock | 19 ++++++++ Cargo.toml | 3 +- README.md | 14 ++++++ crates/sesam-vitale/Cargo.toml | 6 +-- crates/sesam-vitale/src/ssvlib_demo.rs | 9 ++-- crates/utils/Cargo.toml | 9 ++++ crates/utils/src/config.rs | 48 +++++++++++++++++++ crates/utils/src/lib.rs | 1 + 11 files changed, 102 insertions(+), 9 deletions(-) rename crates/sesam-vitale/.env.linux.example => .env.linux.example (100%) rename crates/sesam-vitale/.env.win.example => .env.win.example (100%) create mode 100644 crates/utils/Cargo.toml create mode 100644 crates/utils/src/config.rs create mode 100644 crates/utils/src/lib.rs diff --git a/crates/sesam-vitale/.env.linux.example b/.env.linux.example similarity index 100% rename from crates/sesam-vitale/.env.linux.example rename to .env.linux.example diff --git a/crates/sesam-vitale/.env.win.example b/.env.win.example similarity index 100% rename from crates/sesam-vitale/.env.win.example rename to .env.win.example diff --git a/.gitignore b/.gitignore index 7e3d3ac..e238176 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ target/ *.sln *.sw? +# Ignore .env files +.env diff --git a/Cargo.lock b/Cargo.lock index 2df2156..f729483 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1097,6 +1097,15 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys 0.4.1", +] + [[package]] name = "dirs" version = "4.0.0" @@ -3951,6 +3960,7 @@ dependencies = [ "dotenv", "libc", "thiserror", + "utils", ] [[package]] @@ -5068,6 +5078,15 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utils" +version = "0.1.0" +dependencies = [ + "anyhow", + "directories", + "dotenv", +] + [[package]] name = "uuid" version = "0.8.2" diff --git a/Cargo.toml b/Cargo.toml index ebb5ebe..4831495 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,5 +3,6 @@ resolver = "2" members = [ "crates/app", "crates/sesam-vitale", - "crates/desktop" + "crates/desktop", + "crates/utils", ] diff --git a/README.md b/README.md index 340e73d..f928f81 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,20 @@ Logiciel de Pharmacie libre et open-source. - `app`: Interface du logiciel, servie par un serveur web propulsé par Axum. Utilisable en mode endpoint ou encapsulé dans le client `desktop` - `desktop`: Client desktop propulsé par Tauri, encapsulant le serveur web `app` - `sesam-vitale`: Bibliothèque de gestion des services SESAM-Vitale (Lecture des cartes CPS et Vitale, téléservices ...) +- `utils`: Bibliothèque de fonctions utilitaires + +## Installation + +### Fichiers de configuration + +Certaines librairies nécessitent de définir certaines paramètres de configuration pour fonctionner correctement, en particulier le moteur SESAM-Vitale. + +Ces paramètres sont définis dans un fichier de configuration `.env` situé dans un des dossiers suivant (par ordre de priorité) : +- dans le dossier courant (`./.env`) +- dans le dossier du manifeste (par exemple `crates/sesam-vitale/.env`) +- dans le dossier de configuration standard de l'OS (par exemple, sur linux, `~/.config/krys4lide/.env` - [plus d'info](https://github.com/dirs-dev/directories-rs?tab=readme-ov-file#projectdirs)) + +Des exemples de fichiers de configuration sont disponibles à la racine du projet : `.env.linux.example` et `.env.win.example`. ## Development diff --git a/crates/sesam-vitale/Cargo.toml b/crates/sesam-vitale/Cargo.toml index 07c5758..a61ee67 100644 --- a/crates/sesam-vitale/Cargo.toml +++ b/crates/sesam-vitale/Cargo.toml @@ -4,10 +4,10 @@ version = "0.1.0" edition = "2021" [dependencies] -anyhow = "1.0.86" -dotenv = "0.15" +anyhow = "1.0" libc = "0.2" -thiserror = "1.0.63" +thiserror = "1.0" +utils = { path = "../utils" } [build-dependencies] dotenv = "0.15" diff --git a/crates/sesam-vitale/src/ssvlib_demo.rs b/crates/sesam-vitale/src/ssvlib_demo.rs index 3b79ee8..25386c8 100644 --- a/crates/sesam-vitale/src/ssvlib_demo.rs +++ b/crates/sesam-vitale/src/ssvlib_demo.rs @@ -1,16 +1,16 @@ /// High level API for the SSV library, /// based on the low level bindings in libssv.rs. -extern crate dotenv; use libc::{c_void, size_t}; use std::env; use std::ffi::CString; -use std::path::PathBuf; use std::ptr; use thiserror::Error; use crate::cps::lire_carte; use crate::libssv::{SSV_InitLIB2, SSV_LireConfig}; +use ::utils::config::load_config; + #[derive(Error, Debug)] pub enum SSVDemoError { #[error(transparent)] @@ -66,12 +66,11 @@ fn ssv_lire_config() -> Result<(), SSVDemoError> { pub fn demo() -> Result<(), SSVDemoError> { // TODO : this is probably not working on release, because I'm not sure it exists a CARGO_MANIFEST_DIR and so it can find the `.env` // Maybe we could use a system standard config path to store a config file - let manifest_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR must be set"); - let manifest_path = PathBuf::from(manifest_dir); - dotenv::from_path(manifest_path.join(".env")).ok(); println!("------- Demo for the SSV library --------"); + load_config()?; + ssv_init_lib_2()?; let code_pin = "1234"; diff --git a/crates/utils/Cargo.toml b/crates/utils/Cargo.toml new file mode 100644 index 0000000..fbe8c0e --- /dev/null +++ b/crates/utils/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "utils" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0" +directories = "5.0" +dotenv = "0.15" diff --git a/crates/utils/src/config.rs b/crates/utils/src/config.rs new file mode 100644 index 0000000..d4756f5 --- /dev/null +++ b/crates/utils/src/config.rs @@ -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 { + 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> { + 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") +} diff --git a/crates/utils/src/lib.rs b/crates/utils/src/lib.rs new file mode 100644 index 0000000..ef68c36 --- /dev/null +++ b/crates/utils/src/lib.rs @@ -0,0 +1 @@ +pub mod config; -- 2.45.2 From f16986ce26ea4326fdae42bd93cf895e723cfc10 Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Thu, 22 Aug 2024 20:42:07 +0200 Subject: [PATCH 2/2] refacto: explicit dotenv import in sesam-vitale/build.rs --- crates/sesam-vitale/build.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/sesam-vitale/build.rs b/crates/sesam-vitale/build.rs index 458cfba..2498a7f 100644 --- a/crates/sesam-vitale/build.rs +++ b/crates/sesam-vitale/build.rs @@ -1,13 +1,13 @@ -extern crate dotenv; - use std::env; use std::path::PathBuf; +use dotenv::from_path; + fn main() { // Load the .env.build file for build-time environment variables let manifest_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR must be set"); let manifest_path = PathBuf::from(manifest_dir); - dotenv::from_path(manifest_path.join(".env.build")).ok(); + from_path(manifest_path.join(".env.build")).ok(); println!("cargo::rerun-if-env-changed=SESAM_FSV_LIB_PATH"); println!("cargo::rerun-if-env-changed=SESAM_FSV_SSVLIB"); -- 2.45.2