Expand description
§cfg-rs: A Configuration Library for Rust Applications
cfg-rs is a lightweight, flexible configuration loader for Rust applications. It composes multiple sources (files, env, inline maps, random, etc.), supports live refresh, placeholder expansion, and derive-based typed configs — all without a serde dependency.
See the examples directory for end-to-end demos: https://github.com/leptonyu/cfg-rs/tree/main/examples
§Features
- Single call to load typed config: see Configuration::get
- Derive your config types: see FromConfig
- Default values via field attributes: see field attributes
- Placeholder expansion like
${cfg.key}: see ConfigValue - Random values under the
randfeature (e.g.configuration.get::<u8>("random.u8")) - Refreshable values via RefValue and refreshable Configuration
- Pluggable sources with clear priority: see register_source1
- No serde dependency
§Supported formats and feature flags
Built-in file parsers (enable via Cargo features):
toml: extensions.toml,.tmlyaml: extensions.yaml,.ymljson: extension.jsonini: extension.ini
Other useful features:
rand: random value provider (e.g.random.u8,random.string)log: minimal logging integration for value parsingcoarsetime: coarse time helpers for time-related values
§Installation
Add to your Cargo.toml with the features you need:
[dependencies]
cfg-rs = { version = "^0.6", features = ["toml"] }For a batteries-included setup, use the convenience feature set:
cfg-rs = { version = "^0.6", features = ["full"] }§Quick start
§1) One-liner with predefined sources
use cfg_rs::*;
let configuration = Configuration::with_predefined().unwrap();
// use configuration.get::<T>("your.key") or derive types (see below)See PredefinedConfigurationBuilder::init for details.
§2) Customize predefined builder
use cfg_rs::*;
init_cargo_env!();
let configuration = Configuration::with_predefined_builder()
.set_cargo_env(init_cargo_env())
.init()
.unwrap();§3) Compose your own sources (priority = registration order)
use cfg_rs::*;
init_cargo_env!();
let mut configuration = Configuration::new()
// Layer 0: Cargo env source.
.register_source(init_cargo_env()).unwrap()
// Layer 1: Inline key-values.
.register_kv("inline")
.set("hello", "world")
.finish()
.unwrap();
// Layer 2: Random values (feature = "rand").
#[cfg(feature = "rand")]
{
configuration = configuration.register_random().unwrap();
}
// Layer 3: All environment variables with prefix `CFG_`.
configuration = configuration.register_prefix_env("CFG").unwrap();
// Layer 4: File(s) — extension inferred by feature (e.g. yaml).
configuration = configuration.register_file("/conf/app.yaml", true).unwrap();
// Optional: register an inline file content (e.g. TOML) and merge.
#[cfg(feature = "toml")]
{
let toml = inline_source!("../app.toml").unwrap();
configuration = configuration.register_source(toml).unwrap();
}
// Finally use it.
// let port: u16 = configuration.get("server.port").unwrap();See register_kv, register_file, register_random, and register_prefix_env.
§4) Handy helpers for tests and small apps
- From inline map (macro):
#[derive(Debug, cfg_rs::FromConfig)]
struct AppCfg { port: u16, host: String }
let cfg: AppCfg = cfg_rs::from_static_map!(AppCfg, {
"port" => "8080",
"host" => "localhost",
});- From environment variables:
#[derive(Debug, cfg_rs::FromConfig)]
struct AppCfg { port: u16, host: String }
std::env::set_var("CFG_APP_PORT", "8080");
std::env::set_var("CFG_APP_HOST", "localhost");
let cfg: AppCfg = cfg_rs::from_env("CFG_APP").unwrap();§Derive typed configs
Implement strong-typed configs via derive:
#[derive(Debug, cfg_rs::FromConfig)]
#[config(prefix = "cfg.app")] // optional, implements FromConfigWithPrefix
struct AppCfg {
port: u16, // required
#[config(default = true)]
enabled: bool, // has default value
#[config(name = "ip")] // remap field name
host: String,
}Attributes summary:
#[config(prefix = "cfg.app")]on struct: implementFromConfigWithPrefix#[config(name = "...")]on field: rename field key#[config(default = <expr>)]on field: default value when missing
See the full reference in derive.FromConfig.
§Placeholders, randoms, and refresh
- Placeholder expansion: use
${some.key}inside string values; see ConfigValue - Random values: under
rand, keys likerandom.u8,random.stringprovide per-read randoms - Refreshing:
Configuration::refresh()re-reads sources that allow refresh;RefValue<T>updates on refresh
§Examples
Browse runnable examples covering common patterns:
simple: minimal setup (full feature set)profile: working with profiles (requirestoml)watch: basic file watching and refresh (requiresyaml)refresh: manual refresh andRefValuelogger: logging integration (requiresfull)thread_pool,salak,test_suit: larger samples and integrations
https://github.com/leptonyu/cfg-rs/tree/main/examples
§Minimum supported Rust version
rustc 1.81+
§License
MIT © contributors. See LICENSE.
§Tips and notes
- Source priority is deterministic: earlier registrations override later ones1
- This crate intentionally does not depend on serde
- Docs.rs builds enable all features for a comprehensive reference
Modules§
Macros§
- from_
static_ map - Macro to generate config instance from a map of key-value pairs. The keys in the map are config keys, e.g. “port”. The values in the map are string values, e.g. “8080”. This macro will panic if any required config is missing or if any config value cannot be parsed into the expected type.
- impl_
enum - Implement
FromConfigfor enums. - init_
cargo_ env - Collect all
CARGO_PKG_*env variables, andCARGO_BIN_NAMEinto configuration. - inline_
source - Inline config file in repo, see Supported File Formats.
Structs§
- Config
Context - Configuration Context.
- Configuration
- Configuration Instance, See Examples, How to Initialize Configuration for details.
- From
StrHolder - Wrapper for all FromStr type.
- Predefined
Configuration Builder - Predefined Configuration Builder. See init for details.
- RefValue
RefValuemeans reference of value or refreshable value, it holds a value which can be updated whenConfigurationis refreshed.
Enums§
- Config
Error - Configuration Error.
- Config
Value - Config value, ConfigSource use this value to store config properties.
Traits§
- From
Config - Generate config instance from configuration.
- From
Config With Prefix - Config with prefix. This trait is auto derived by FromConfig.
- From
String Value - Get from string.
Functions§
- from_
env - Generate config instance from environment variables.
The
prefixis used to scope the config keys, e.g. “CFG_APP”. This function will return an error if any required config is missing or if any config value cannot be parsed into the expected type. - from_
map - Generate config instance from a map of key-value pairs.
The keys in the map are full config keys, e.g. “cfg.app.port”.
The values in the map are string values, e.g. “8080”.
The
prefixis used to scope the config keys, e.g. “cfg.app”. This function will return an error if any required config is missing or if any config value cannot be parsed into the expected type.
Type Aliases§
- Config
Key - Config key, ConfigSource use this key to access config properties.
Derive Macros§
- From
Config - Automatic derive
FromConfiginstance.