Typed configuration.
Loads and fully validates configuration (file → environment → flags) before
any socket opens, producing validated value objects the other crates consume
(docs/01 §6). Invalid config fails fast with a typed, actionable
[ConfigError] naming the bad field. It contains no business logic, it only
turns strings into validated values; mapping those to domain types (the
crypto provider, the pipeline) is the binary's job. Hot-reloadable state
(directives, placement) goes through osproxy-control, not here.
Example
use Config;
// Defaults apply when nothing is set; a bad value is a typed error.
let cfg = resolve_for_test.unwrap;
assert_eq!;
assert!;
assert!;