viperus

̶g̶o̶ rust configuration with fangs!
viperus is an (in)complete configuration solution for Rust applications. inspired heavly inspired by the wonderful go package https://github.com/spf13/viper I have already said that it is incomplete? use at your own risk. ;-)
no Go projects are built using Viperus :-)
What is Viperus?
handle some types of configuration needs and formats. It supports:
- setting defaults
- reading from JSON, TOML, YAML, envfile ,java properties config files
- reading from environment variables
- reading from Clap command line flags
- setting explicit values
- reload of all files
Why Viperus?
beacuse I was migrating some go apps... and a was missing Viper ease of use :-)
Viperus uses the following decreasing precedence order.
- explicit call to
add - clap flag
- env
- config
- default
Viperus merge configuration from toml,dotenv,json,yaml files and clap options in sigle typed hash structure. with defaults, and type checking
you can create a stand alone Viperus object or "enjoy" a global instance ( thread safe protected with a mutex) via shadow functions load_file|get|add|load_clap that are routed to the static instance.
load_file.unwrap;
let ok=.unwrap;
by the way , Yes I konw globals are evil. but as I was inspired by the go package viper.... if you dislike globals you can opt-out disabling in your cargo.toml the feature "global".
logging/debug
the crate uses log facade , and test the env_logger you can set the env variable to RUST=viperus=[DEBUG LEVEL] with
[DEBUG LEVEL] = info|warning|debug
Example
you can find some integration tests in the test dir and also in the example forlder you can run example with cargo
cargo run --example cli-clap-yaml --
cargo run --example cli-clap-yaml -- -u http://nowhere/api/v1
the first run print the value from the example.yaml file the second from the cli arg
let matches = new
.arg
.get_matches;
let mut v = new;
//enable clap
v.load_clap;
//enable a yaml json toml file
v.load_file.unwrap;
v.load_file.unwrap;
v.load_file.unwrap;
v.load_file.unwrap;
//link the "v" clap option to the key "verbose"
v.bond_clap;
//add an explicit overload
v.add;
debug!;
//get a typed key
let s: &str = v.get.unwrap;
assert_eq!;
//get a bool from configs or app args
let fVerbose=v..unwrap;
assert_eq!;
Todo
- remote configs
- error propagation
- type inference for .env and java propertie files from defaults
- stabilize api
- documentation
- improve my rust karma
Changes
- 0.1.4 add format : java properties files
- 0.1.3 better clap args : default values
- 0.1.2 relaod config from files
- 0.1.1 fixes dcs
- 0.1.0 first release