La bibliothèque config pour la gestion de configuration en Rust
Lors du développement d'applications en Rust, la gestion flexible des paramètres est une tâche importante. La bibliothèque config (crate config) offre un moyen puissant et pratique de travailler avec des fichiers de configuration, des variables d'environnement et des valeurs intégrées. Elle prend en charge les formats TOML, JSON, YAML, HJSON, INI et permet de fusionner les paramètres de plusieurs sources avec des priorités.
Installation
Ajoutez la dépendance dans Cargo.toml :
[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }Utilisation de base
Créons un simple fichier de configuration Settings.toml :
[server]host = "127.0.0.1"port = 8080
[database]url = "postgres://user:pass@localhost/mydb"pool_size = 10Chargeons-le maintenant dans une application Rust :
use config::{Config, File, Environment};use serde::Deserialize;
#[derive(Debug, Deserialize)]struct ServerConfig { host: String, port: u16,}
#[derive(Debug, Deserialize)]struct DatabaseConfig { url: String, pool_size: u32,}
#[derive(Debug, Deserialize)]struct AppConfig { server: ServerConfig, database: DatabaseConfig,}
fn main() -> Result<(), config::ConfigError> { let settings = Config::builder() .add_source(File::with_name("Settings")) .add_source(Environment::with_prefix("APP")) .build()?;
let app_config: AppConfig = settings.try_deserialize()?; println!("Serveur : {}:{}", app_config.server.host, app_config.server.port); println!("Base de données : {}", app_config.database.url); Ok(())}Prise en charge de plusieurs formats
La bibliothèque détecte automatiquement le format par l'extension du fichier. Exemple avec JSON :
let settings = Config::builder() .add_source(File::with_name("config.json")) .add_source(File::with_name("override.yaml").required(false)) .build()?;Variables d'environnement
Utilisez un préfixe pour les variables d'environnement afin de surcharger les paramètres sans modifier les fichiers :
// Exécution : APP_SERVER__PORT=9090 cargo runlet settings = Config::builder() .add_source(File::with_name("Settings")) .add_source(Environment::with_prefix("APP").separator("__")) .build()?;Paramètres imbriqués et tableaux
Les structures hiérarchiques sont prises en charge :
#[derive(Debug, Deserialize)]struct AppConfig { features: Vec<String>, logging: LoggingConfig,}
#[derive(Debug, Deserialize)]struct LoggingConfig { level: String, file: Option<String>,}Exemple TOML avec des tableaux :
features = ["auth", "caching", "metrics"]
[logging]level = "info"file = "/var/log/app.log"Fusion de configurations
La bibliothèque permet de superposer les paramètres de différentes sources. Les sources ultérieures ont une priorité plus élevée :
let settings = Config::builder() .add_source(File::with_name("default")) // paramètres de base .add_source(File::with_name("production").required(false)) // production .add_source(Environment::with_prefix("APP")) // variables d'environnement .build()?;Gestion des erreurs et valeurs par défaut
Utilisez get() pour obtenir des valeurs individuelles avec une valeur de repli :
let port: u16 = settings.get("server.port").unwrap_or(8080);let debug: bool = settings.get("debug").unwrap_or(false);Accès dynamique aux paramètres
Si la structure de configuration est inconnue à l'avance, utilisez l'accès dynamique :
let val = settings.get_string("database.url")?;let timeout = settings.get_int("timeout") Aussi dans la bibliothèque
Client Elasticsearch pour C# (.NET) : NEST et Elastic.Clients.Elasticsearch
Timber pour Kotlin : guide complet avec exemples
Files d'attente de tâches pour Rust : aperçu et exemples d'utilisation
Framework Laravel pour PHP : guide complet avec exemples
Génération de PDF en Swift (iOS/macOS) : UIGraphicsPDFRenderer, PDFKit et Core Graphics