Biblioteca config para gerenciamento de configuração em Rust
No desenvolvimento de aplicações em Rust, uma tarefa importante é o gerenciamento flexível das configurações. A biblioteca config (crate config) fornece uma maneira poderosa e conveniente de trabalhar com arquivos de configuração, variáveis de ambiente e valores embutidos. Ela suporta os formatos TOML, JSON, YAML, HJSON, INI e permite combinar configurações de várias fontes com prioridades.
Instalação
Adicione a dependência no Cargo.toml:
[dependencies]config = "0.14"serde = { version = "1.0", features = ["derive"] }Uso básico
Vamos criar um arquivo de configuração simples Settings.toml:
[server]host = "127.0.0.1"port = 8080
[database]url = "postgres://user:pass@localhost/mydb"pool_size = 10Agora vamos carregá-lo na aplicação 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!("Banco de dados: {}", app_config.database.url); Ok(())}Suporte a múltiplos formatos
A biblioteca detecta automaticamente o formato pela extensão do arquivo. Exemplo com JSON:
let settings = Config::builder() .add_source(File::with_name("config.json")) .add_source(File::with_name("override.yaml").required(false)) .build()?;Variáveis de ambiente
Use um prefixo para variáveis de ambiente para sobrescrever configurações sem alterar arquivos:
// Execução: APP_SERVER__PORT=9090 cargo runlet settings = Config::builder() .add_source(File::with_name("Settings")) .add_source(Environment::with_prefix("APP").separator("__")) .build()?;Configurações aninhadas e arrays
São suportadas estruturas hierárquicas:
#[derive(Debug, Deserialize)]struct AppConfig { features: Vec<String>, logging: LoggingConfig,}
#[derive(Debug, Deserialize)]struct LoggingConfig { level: String, file: Option<String>,}Exemplo TOML com arrays:
features = ["auth", "caching", "metrics"]
[logging]level = "info"file = "/var/log/app.log"Combinação de configurações
A biblioteca permite sobrepor configurações de diferentes fontes. Fontes posteriores têm maior prioridade:
let settings = Config::builder() .add_source(File::with_name("default")) // configurações base .add_source(File::with_name("production").required(false)) // produção .add_source(Environment::with_prefix("APP")) // variáveis de ambiente .build()?;Tratamento de erros e valores padrão
Use get() para obter valores individuais com fallback:
let port: u16 = settings.get("server.port").unwrap_or(8080);let debug: bool = settings.get("debug").unwrap_or(false);Acesso dinâmico às configurações
Se a estrutura da configuração não for conhecida antecipadamente, use acesso dinâmico:
let val = settings.get_string("database.url")?;let timeout = settings.get_int("timeout") Também na biblioteca
Serialização de objetos em Go (Golang): Guia completo
Geolocalização e Mapas em C# (.NET): bibliotecas, exemplos e recomendações
Integração de métricas Prometheus em C++: biblioteca prometheus-cpp