I\'m trying to load passwords and sensitive data from the system\'s environment when my service starts up. I\'ve tried a number of different ways but can\'t seem to figure o
const
and static
fill different roles in Rust.
const
does not only mean a constant, it means a compile-time constant, a value determined at compile-time and inscribed in the read-only memory of the program. It is not suitable for your usecase.
static
means a global variable, with a lifetime that will span the entire program. It may be mutable, in which case it must be Sync
to avoid concurrent modifications. A static
variable must be initialized from a constant, in order to be available from the start of the program.
So, how to read a variable at run-time and have it available? Well, a clean solution would be to avoid globals altogether...
... but since it can be convenient, there is a crate for it: lazy_static!.
use std::env::var;
use lazy_static::lazy_static;
lazy_static! {
static ref PASSWORD: String = var("PASSWORD").unwrap();
}
fn main() {
println!("{:?}", *PASSWORD);
}
On first access to the variable, the expression is executed to load its value, the value is then memorized and available until the end of the program.