Environment and Configuration
Accessing environment variables
JavaScript doesn't provide access to environment variables natively. However, some non-browser JavaScript runtimes, such as Node.js and Node provides access to environment variables.
In Node.js:
const name = "EXAMPLE_VARIABLE";
let value = process.env[name];
if (!value) {
console.log(`Variable '${name}' not set.`);
} else {
console.log(`Variable '${name}' set to '${value}'.`);
}
In Deno:
const name = "EXAMPLE_VARIABLE";
let value = Deno.env.get(name);
if (!value) {
console.log(`Variable '${name}' not set.`);
} else {
console.log(`Variable '${name}' set to '${value}'.`);
}
Rust is providing the same functionality of accessing an environment variable at runtime via the var
and var_os
functions from the std::env
module.
var
function is returning a Result<String, VarError>
, either returning the variable if set or returning an error if the variable is not set or it is not valid Unicode.
var_os
has a different signature giving back an Option<OsString>
, either returning some value if the variable is set, or returning None if the variable is not set. An OsString
is not required to be valid Unicode.
use std::env;
fn main() {
let key = "ExampleVariable";
match env::var(key) {
Ok(val) => println!("{key}: {val:?}"),
Err(e) => println!("couldn't interpret {key}: {e}"),
}
}
use std::env;
fn main() {
let key = "ExampleVariable";
match env::var_os(key) {
Some(val) => println!("{key}: {val:?}"),
None => println!("{key} not defined in the enviroment"),
}
}
Rust is also providing the functionality of accessing an environment variable at compile time. The env!
macro from std::env
expands the value of the variable at compile time, returning a &'static str
. If the variable is not set, an error is emitted.
use std::env;
fn main() {
let example = env!("ExampleVariable");
println!("{example}");
}
Configuration
JavaScript doesn't support configurations.
In Rust it is available via use of third-party crates such as figment or config. See the following example making use of config crate:
use config::{Config, Environment};
fn main() {
let builder = Config::builder().add_source(Environment::default());
match builder.build() {
Ok(config) => {
match config.get_string("examplevar") {
Ok(v) => println!("{v}"),
Err(e) => println!("{e}")
}
},
Err(_) => {
// something went wrong
}
}
}