Configuração de aplicações Rust: biblioteca `config` para configuração flexível

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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


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

Recommendations