Como ler variáveis de ambiente na linguagem Rust
Em diversas situações a gente pode precisar utilizar variáveis de ambiente, alguns exemplos incluem:
Alterar o comportamento do software através de Feature flags
- Dar acesso a segredos e chaves de API
- Personalizar a configuração do software - por exemplo, alterar a porta de um servidor
Para facilitar o aprendizado, eu montei um vídeo bem simples pra explicar tudo o que está aqui no artigo:
Como ler variáveis de ambiente com Rust utilizando a biblioteca padrão
Rust possui uma biblioteca padrão bem completinha, que é a std. Para acessar variáveis de ambiente utilizando esta biblioteca, você pode utilizar a função std::env::var() e o seu tipo de retorno é um objeto do tipo Result<String, VarError>
.
Então para obter uma variável de ambiente chamada SERVER_PORT
podemos fazer algo como o seguinte:
fn main() {
let port = std::env::var("SERVER_PORT").unwrap_or("8080".to_string());
println!("A porta e {}", port);
}
Repare que como o retorno é do tipo Result<String, VarError>
você pode utilizar a função unwrap_or() para definir um valor padrão caso a variável não esteja presente. Portanto ao rodar o programa, temos as seguintes saídas:
$ cargo run
A porta e 8080
$ SERVER_PORT=9090 cargo run
A porta e 9090
Como ler variáveis de ambiente em tempo de compilação com Rust
As vezes é importante mudar o comportamento do software em tempo de compilação e mantê-lo fixo durante o tempo de execução, por exemplo criar um comportamento diferente para ambientes Windows e Linux, ou utilizando o X11 ou Wayland.
Para fazer algo assim, também é possível utilizar variáveis de ambiente porém precisamos utilizar a macro env!()
que retorna um &'static str
. É importante notar que quando a macro env! é utilizada, a variável de ambiente precisa estar presente no momento da compilação - caso contrário um erro de compilação ocorre. Veja:
fn main() {
let default_port = env!("DEFAULT_SERVER_PORT");
println!("A porta padrao e {}", default_port);
}
Ao compilar sem a variável de ambiente:
$ cargo build
error: environment variable `DEFAULT_SERVER_PORT` not defined at compile time
E ao compilar com a variável de ambiente definida e rodar o programa (que se chama rust-env no meu exemplo):
$ DEFAULT_SERVER_PORT=8080 cargo build
$ ./target/debug/rust-env
A porta padrao e 8080
$ DEFAULT_SERVER_PORT=9090 ./target/debug/rust-env
A porta padrao e 8080
Repare que ao rodar o binário, mesmo que a variável DEFAULT_SERVER_PORT
seja redefinida, o software não a utiliza. Isto porque a macro env! só opera em tempo de compilação.
Comentários