Crate configure_me
source ·Expand description
This library aims to help with reading configuration of application from files, environment variables and command line arguments, merging it together and validating. It auto-generates most of the code for you based on configuration (heh) file. It creates a struct for you, which contains all the parsed and validated fields, so you can access the information quickly easily and idiomatically.
Important note: since this is generating code, it’s intended to be used from build script.
Example
Let’s say, your application needs these parametrs to run:
- Port - this is mandatory
- IP address to bind to - defaults to 0.0.0.0
- Path to TLS certificate - optional, the server will be unsecure if not given
First you create Toml configuration file specifying all the parameters:
[[param]]
name = "port"
type = "u16"
optional = false
[[param]]
name = "bind_addr"
type = "::std::net::Ipv4Addr"
default = "::std::net::Ipv4Addr::new(0, 0, 0, 0)" # Rust expression that creates the value
[[param]]
name = "tls_cert"
type = "String"
Then, you create a build script like this:
extern crate configure_me;
fn main() {
let mut out: std::path::PathBuf = std::env::var_os("OUT_DIR").unwrap().into();
out.push("config.rs");
let config_spec = std::fs::File::open("config.toml").unwrap();
let config_code = std::fs::File::create(&out).unwrap();
configure_me::generate_source(config_spec, config_code).unwrap();
println!("rerun-if-changed=config.toml");
}
Add dependencies to Cargo.toml
:
[packge]
# ...
build = "build.rs"
[dependencies]
serde = "1"
serde_derive = "1"
toml = "0.4"
[build-dependencies]
configure_me = "0.2.2"
Create a module src/config.rs
for configuration:
#![allow(unused)]
include!(concat!(env!("OUT_DIR"), "/config.rs"));
And finally add appropriate incantiations into src/main.rs
:
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate toml;
mod config;
fn main() {
use config::prelude::*;
// This will read configuration from "/etc/my_awesome_server/server.conf" file and
// the command-line arguments.
let (server_config, _remaining_args) = Config::including_optional_config_files(&["/etc/my_awesome_server/server.conf]").unwrap_or_exit();
// Your code here
// E.g.:
let listener = std::net::TcpListener::bind((server_config.bind_addr, server_config.port)).expect("Failed to bind socket");
Ok(())
}
Structs
Functions
toml
configuration.