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 04bba4d..01232bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1080,6 +1080,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" @@ -3917,6 +3926,7 @@ version = "0.1.0" dependencies = [ "dotenv", "libc", + "utils", ] [[package]] @@ -5034,6 +5044,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 e62b5db..1592889 100644 --- a/crates/sesam-vitale/Cargo.toml +++ b/crates/sesam-vitale/Cargo.toml @@ -4,8 +4,8 @@ version = "0.1.0" edition = "2021" [dependencies] -dotenv = "0.15" libc = "0.2" +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 b9ee114..f7faeec 100644 --- a/crates/sesam-vitale/src/ssvlib_demo.rs +++ b/crates/sesam-vitale/src/ssvlib_demo.rs @@ -1,15 +1,15 @@ /// 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 crate::cps::lire_carte; use crate::libssv::{SSV_InitLIB2, SSV_LireConfig}; +use ::utils::config::load_config; + fn ssv_init_lib_2() { let ini_str = env::var("SESAM_INI_PATH").expect("SESAM_INI_PATH must be set"); let ini = CString::new(ini_str).expect("CString::new failed"); @@ -41,12 +41,11 @@ fn ssv_lire_config() { pub fn demo() { // 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").unwrap(); - let manifest_path = PathBuf::from(manifest_dir); - dotenv::from_path(manifest_path.join(".env")).ok(); println!("------- Demo for the SSV library --------"); + load_config().unwrap(); + 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;