#env-var #load #env #environment

frenv

A generic config loader from environment variables

3 releases

0.1.2 Dec 31, 2024
0.1.1 Dec 21, 2024
0.1.0 Dec 20, 2024

#486 in Configuration

MIT license

4KB
57 lines

Frenv

** Frenv is generic Rust data structure loader from environment variables.

Frenv in action

use frenv::FromEnv;

#[derive(FromEnv, Debug)]
struct Config {
    // Loads from HOST env var.
    host: String,
    // Loads from PORT env var.
    port: u16,
    redis_config: RedisConfig,
    rabbit_config: RabbitMqConfig,
}

#[derive(FromEnv, Debug)]
#[frenv(prefix = "REDIS")]
struct RedisConfig {
    // Loads from REDIS_HOST env var.
    host: String,
    // Loads from REDIS_PORT env var.
    port: u16,
}

#[derive(FromEnv, Debug)]
#[frenv(prefix = "RABBITMQ")]
struct RabbitMqConfig {
    // Loads from RABBITMQ_NAME env var, but sets default value from fn if is missing.
    #[frenv(default = "Self::default_name")]
    name: String,
    // Loads from RABBITMQ_SENTINEL_HOST env var.
    #[frenv(prefix = "SENTINEL")]
    host: String,
    // Loads from RABBITMQ_SENTINEL_PORT env var.
    #[frenv(prefix = "SENTINEL")]
    port: u16,
    // Loads from RABBITMQ_SENTINEL_PASSWORD env var.
    #[frenv(prefix = "SENTINEL")]
    password: String,
}

impl RabbitMqConfig {
    fn default_name() -> String {
        "rabbit".to_string()
    }
}

fn main() {
    std::env::set_var("HOST", "localhost");
    std::env::set_var("PORT", 8000);
    std::env::set_var("REDIS_HOST", "localhost");
    std::env::set_var("REDIS_PORT", 8001);
    std::env::set_var("RABBITMQ_NAME", "localhost");
    // std::env::set_var("RABBITMQ_SENTINEL_NAME", "name"); // doest not set so it loads from Default
    std::env::set_var("RABBITMQ_SENTINEL_PORT", 8002);
    std::env::set_var("RABBITMQ_SENTINEL_PASSWORD", "secretpassword");

    let config = Config::from_env().expect("failed to load config from env");

    // prints loaded = Config { host: "localhost", port: 8000, ... }
    println!("loaded = {:?}", config);
}

Dependencies

~225–660KB
~15K SLoC