Expand description
§tanzim-source
Package | Documentation | Repository
Declarative configuration source: where to load from, loader options, and address.
§Format
SOURCE [(OPTIONS)] [?] [:RESOURCE]| Part | Meaning |
|---|---|
SOURCE | Loader kind (opaque string, e.g. env, file, http) |
(OPTIONS) | Optional loader options as key=value pairs |
? | Skip errors when loading this source (non-fatal loader failures) |
:RESOURCE | Optional address (path, URL, …); may be empty |
§String examples
env
env(prefix=APP_)
file:/etc/app/config.json
file?:.env
file?
env:
http(headers=(Authorization="TOKEN"),timeout=3s)?:https://example.com/config.yml
env(kv=salam,h=(o=b,z=[1,2,3.14,""]))?:oops§Rules
SOURCEand option keys — ASCII letters, digits,-,_,.(non-empty).- No whitespace anywhere except inside
"quoted"strings. - Option values — try, in order: boolean, integer, float, list, map; otherwise unquoted string.
- Booleans:
true/false(case-insensitive). - Integers: base-10, optional leading
-(no+). - Floats: digits,
., optional leading-(e.g.3.14; not.5). - Lists:
[value,value,…] - Maps:
(key=value,…)(same value grammar). - Unquoted strings: letters, digits,
-,_,.only (e.g.APP_,3s). - Quoted strings:
"…"with escapes\",\\,\n,\r,\t.
- Booleans:
- Empty value — error; use
"". - Trailing commas — error (
(a=1,)/[1,]). - Duplicate keys in
(OPTIONS)— last wins. ?(skip errors) — must come afterSOURCEor after the closing)of(OPTIONS); never before(OPTIONS)(wrong:env?(prefix=APP), right:env(prefix=APP)?).- Errors —
ParseErrormessages refer to configuration source. Use{error:#}for snippet + caret.
§Parsing
use tanzim_source::Source;
let env = Source::parse("env(prefix=APP_)")?;
let file: Source = "file:/etc/app/config.json".parse()?;
let dotenv = Source::try_from("file?:.env")?;
assert_eq!(env.source(), "env");
assert_eq!(env.to_string(), "env(prefix=APP_)");
assert_eq!(file.resource(), "/etc/app/config.json");
assert!(dotenv.skip_errors());Build programmatically with SourceBuilder:
use tanzim_source::SourceBuilder;
let source = SourceBuilder::new()
.with_source("env")
.with_option("prefix", "APP")
.with_skip_errors(false)
.build()?;Try sources from the command line:
cargo run -p tanzim-source --example parse_sources -- \
'env(prefix=APP_)' \
'file:/etc/app/config.json'§Serde
Enable the serde feature to embed Source in config files as a string (canonical form round-trips):
[dependencies]
tanzim-source = { version = "0.1", features = ["serde"] }use tanzim_source::Source;
use serde::Deserialize;
#[derive(Deserialize)]
struct App {
sources: Vec<Source>,
}
let app: App = serde_json::from_str(r#"{ "sources": ["env(prefix=APP_)", "file:/etc/app/config.json"] }"#)?;
assert_eq!(app.sources[0].source(), "env");Invalid strings surface parse errors through serde with configuration source in the message:
use tanzim_source::Source;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct App { source: Source }
let error = serde_json::from_str::<App>(r#"{ "source": "env(prefix=)" }"#).unwrap_err();
assert!(error.to_string().contains("configuration source option value"));§Cargo features
| Feature | Enables |
|---|---|
serde | Serialize / Deserialize for Source as its canonical string |
§Relations
- Used by all other tanzim crates to represent where to load from.
tanzim-loadconsumesSourcefields (source,options,resource) in its loaders.- Full pipeline wired in
tanzim.
Structs§
- Options
- Ordered map of loader options.
- Source
- One configuration source declaration.
- Source
Builder - Builds a
Source.
Enums§
- Error
- Error from building or parsing a
Source. - Option
Value - Dynamically typed loader option or nested option map.
- Option
Value Type - Kind of value stored in
OptionValue. - Parse
Error - Error while parsing a configuration source string.
Functions§
- parse
- Parse a configuration source string.