Última atualização:
Capa: variaveis de ambiente na linguagem Rust
Foto: Rompalli Harish, via Pexels

Como ler variáveis de ambiente na linguagem Rust

Nawarian
Nawarian 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