Configuración de aplicaciones Rust: biblioteca `config` para ajustes flexibles

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 = 10


Ahora 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")                    

Recommendations