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 Source;
let env = parse?;
let file: Source = "file:/etc/app/config.json".parse?;
let dotenv = try_from?;
assert_eq!;
assert_eq!;
assert_eq!;
assert!;
# Ok::
Build programmatically with SourceBuilder:
use SourceBuilder;
let source = new
.with_source
.with_option
.with_skip_errors
.build?;
# Ok::
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):
[]
= { = "0.1", = ["serde"] }
#
#
#
#
Invalid strings surface parse errors through serde with configuration source in the message:
#
#
#
#
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.