apollo-configuration 0.4.0

A typed, friendly configuration system for Apollo products.
Documentation
use apollo_configuration::configuration;
use apollo_configuration::parse_yaml;
use apollo_configuration::types::Url;

#[configuration]
struct OptionConfig {
    endpoint: Option<Url>,
}

#[test]
fn option_some_parses() {
    let config: OptionConfig =
        parse_yaml("endpoint: https://example.com", &Default::default()).unwrap();

    assert_eq!(
        config.endpoint.as_ref().unwrap().as_str(),
        "https://example.com/"
    );
}

#[test]
fn option_none_parses() {
    let config: OptionConfig = parse_yaml("{}", &Default::default()).unwrap();
    assert!(config.endpoint.is_none());
}

#[test]
fn option_explicit_null_parses() {
    let config: OptionConfig = parse_yaml("endpoint: null", &Default::default()).unwrap();
    assert!(config.endpoint.is_none());
}

#[test]
fn option_value_error_propagates() {
    let result = parse_yaml::<OptionConfig>("endpoint: '://invalid'", &Default::default());
    let err = result.expect_err("should fail to parse invalid URL");
    assert_eq!(
        format!("{err}"),
        "failed to parse value: relative URL without a base"
    );
}