confu

Crates.ioconfu
lib.rsconfu
version0.1.3
sourcesrc
created_at2021-05-15 19:15:16.651941
updated_at2021-05-20 04:26:40.238566
descriptionNo frills app configuration via environment or args
homepagehttps://github.com/izirku/confu
repositoryhttps://github.com/izirku/confu
max_upload_size
id397967
size7,025
Evgenii (izirku)

documentation

https://docs.rs/confu

README

Confu

No frills app configuration via environment or command line arguments for software written in Rust.

Why Confu? Geared towards microservices, and has minimal direct dependencies list: syn, quote, proc-macro2, proc-macro-error.

if a more user friendly command line parsing desired, there are great and proven crate alternatives. For example, Clap 👏.

Features

  • at compile time (when a binary is produced for your app), captures
    • build type, i.e. debug or release
    • build version, if provided via environment variable [PREFIX]VERSION, otherwise is set to <unspecified>
  • Reads configuration from either
    • environment
    • command line arguments
    • defaults
  • configuration items may have an optional prefix like APP_
  • each config item can be
    • required - if not provided, will panic
    • protected - will display "xxxxxxx" instead of sensitive information
    • hidden - will not be displayed at all
  • Specificity: defaults -> environment -> arguments. Arguments being the most specific, will take precedence over the corresponding environment values, if such are also defined

Usage/Examples

A working example is provided in repository. And a quick usage summary here as well:

In Cargo.toml:

[dependencies]
confu = "*"

then, a code like this:

use confu::Confu;

#[derive(Confu)]
#[confu_prefix = "APP_"]
struct Config {
    #[default = "postgres"]
    db_user: String,

    #[protect]
    #[default = "postgres"]
    db_password: String,

    #[default = "127.0.0.1"]
    api_host: String,

    #[require]
    telemetry: String,

    #[hide]
    super_secret_stuff: String,
}

fn main() {
    let config = Config::confu();
    config.show();
}

should produce something like this, granted that APP_VERSION="0.1.0" environment variable is also set:

$ cargo run --quiet -- --app_telemetry=yes
  build: debug
version: 0.1.0

APP_DB_USER/--app_db_user=postgres  (default: "postgres")
APP_DB_PASSWORD/--app_db_password=xxxxxxx  (default: "xxxxxxx")
APP_API_HOST/--app_api_host=127.0.0.1  (default: "127.0.0.1")
APP_TELEMETRY/--app_telemetry=yes  (required)

if a require argument was omitted, a panic will occur:

$ cargo run --quiet
thread 'main' panicked at 'required argument APP_TELEMETRY/--app_telemetry was not provided.', examples\basic\src\config.rs:4:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Roadmap to v0.2.0

  • Write the documentation
  • Write the tests
  • Produce a better error reporting in macros
  • Parse into numerical and bool types
Commit count: 27

cargo fmt