Biblioteca config para la gestión de configuración en Rust
Al desarrollar aplicaciones en Rust, una tarea importante es la gestión flexible de ajustes. La biblioteca config (crate config) proporciona una forma potente y conveniente de trabajar con archivos de configuración, variables de entorno y valores integrados. Soporta los formatos TOML, JSON, YAML, HJSON, INI y permite combinar ajustes de múltiples fuentes con prioridades.
Instalación
Añada la dependencia en Cargo.toml:
[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }Uso básico
Creemos un archivo de configuración simple Settings.toml:
[server]host = "127.0.0.1"port = 8080
[database]url = "postgres://user:pass@localhost/mydb"pool_size = 10Ahora cárguelo en la aplicación 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!("Servidor: {}:{}", app_config.server.host, app_config.server.port); println!("Base de datos: {}", app_config.database.url); Ok(())}Soporte para múltiples formatos
La biblioteca detecta automáticamente el formato por la extensión del archivo. Ejemplo con JSON:
let settings = Config::builder() .add_source(File::with_name("config.json")) .add_source(File::with_name("override.yaml").required(false)) .build()?;Variables de entorno
Use un prefijo para las variables de entorno, para sobrescribir ajustes sin modificar archivos:
// Ejecución: APP_SERVER__PORT=9090 cargo runlet settings = Config::builder() .add_source(File::with_name("Settings")) .add_source(Environment::with_prefix("APP").separator("__")) .build()?;Ajustes anidados y arreglos
Se soportan estructuras jerárquicas:
#[derive(Debug, Deserialize)]struct AppConfig { features: Vec<String>, logging: LoggingConfig,}
#[derive(Debug, Deserialize)]struct LoggingConfig { level: String, file: Option<String>,}Ejemplo TOML con arreglos:
features = ["auth", "caching", "metrics"]
[logging]level = "info"file = "/var/log/app.log"Combinación de configuraciones
La biblioteca permite superponer ajustes de diferentes fuentes. Las fuentes posteriores tienen mayor prioridad:
let settings = Config::builder() .add_source(File::with_name("default")) // ajustes base .add_source(File::with_name("production").required(false)) // producción .add_source(Environment::with_prefix("APP")) // variables de entorno .build()?;Manejo de errores y valores predeterminados
Use get() para obtener valores individuales con fallback:
let port: u16 = settings.get("server.port").unwrap_or(8080);let debug: bool = settings.get("debug").unwrap_or(false);Acceso dinámico a ajustes
Si la estructura de configuración no se conoce de antemano, use acceso dinámico:
let val = settings.get_string("database.url")?;let timeout = settings.get_int("timeout") También en la biblioteca
gRPC para Swift (iOS/macOS): bibliotecas, configuración y ejemplos de código
Warp para Rust: guía completa con ejemplos
PyNaCl: Biblioteca de criptografía para Python
Procesamiento de imágenes en Node.js: resize, crop con Sharp y Jimp