Librería config para Rust: guía completa para gestionar configuración
1. ¿Qué es y para qué sirve?
La librería config (crate config en el ecosistema Rust) es una herramienta potente y flexible para gestionar la configuración de aplicaciones. Proporciona una interfaz unificada para cargar ajustes desde diversas fuentes: archivos (JSON, YAML, TOML, INI, HJSON), variables de entorno, argumentos de línea de comandos e incluso fuentes remotas. Su objetivo principal es abstraer el proceso de lectura y combinación de configuraciones, permitiendo al desarrollador centrarse en la lógica de negocio en lugar de en el análisis de formatos.
¿Por qué es necesaria en proyectos reales? Las aplicaciones modernas rara vez tienen una única fuente de configuración. Un escenario típico: los ajustes básicos se almacenan en un archivo config.toml, los datos sensibles (contraseñas, claves API) se obtienen de variables de entorno, y los parámetros para una ejecución específica se pasan mediante argumentos de línea de comandos. config permite combinar todas estas fuentes en un único árbol de configuración con una prioridad clara (por ejemplo, las variables de entorno sobrescriben los valores de los archivos). Sin esta librería, el desarrollador tendría que escribir código manualmente para cada fuente, manejar errores de análisis y gestionar el orden de sobrescritura.
Ventajas clave de config: seguridad de tipos total (los ajustes se deserializan en estructuras de Rust), soporte para configuraciones anidadas, seguimiento automático de cambios en archivos (watch) y extensibilidad mediante fuentes de datos personalizadas. La librería se usa ampliamente en proyectos de producción, como servidores web, utilidades CLI y microservicios.
2. Instalación
Para añadir la librería config a un proyecto Rust, utiliza el gestor de paquetes Cargo. Ejecuta en la terminal, dentro del directorio raíz de tu proyecto:
cargo add config
Si prefieres editar manualmente el archivo Cargo.toml, añade en la sección [dependencies]:
[dependencies]
config = "0.14"
También necesitarás un crate para serialización/deserialización. Se recomienda serde con la macro derive:
cargo add serde --features derive
Para trabajar con formatos de archivo específicos, debes añadir los flags de funcionalidad correspondientes. Por ejemplo, para soportar TOML, YAML y JSON:
cargo add config --features yaml,json,toml
Lista completa de formatos disponibles: ini, json, toml, yaml, hjson. Si planeas usar solo un formato, especifica únicamente ese para reducir el tiempo de compilación.
3. Inicio rápido — ejemplo mínimo funcional
Crea un archivo Settings.toml en la raíz del proyecto:
# Settings.toml
[server]
host = "127.0.0.1"
port = 8080
[database]
url = "postgres://user:pass@localhost/db"
pool_size = 10
Ahora escribamos el código para leer esta configuración:
use config::{Config, File, FileFormat};
use serde::Deserialize;
use std::env;
#[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> {
// Creamos el builder de configuración
let builder = Config::builder()
// Añadimos el archivo como fuente
.add_source