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::Regex;
use serde::{Deserialize, Serialize};

#[configuration]
struct RegexConfig {
    #[config(required)]
    pattern: Regex,
}

#[test]
fn regex_parses() {
    let config: RegexConfig = parse_yaml(r#"pattern: "^[a-z]+$""#, &Default::default()).unwrap();
    assert!(config.pattern.is_match("hello"));
    assert!(!config.pattern.is_match("Hello123"));
}

#[test]
fn regex_error_message() {
    let result = parse_yaml::<RegexConfig>(r#"pattern: "[badpattern""#, &Default::default());
    let err = result.expect_err("should reject invalid regex");
    assert_eq!(
        format!("{err}"),
        "failed to parse value: regex parse error:\n    [badpattern\n    ^\nerror: unclosed character class"
    );
}

#[derive(Debug, Deserialize, Serialize)]
struct SerializableRegexConfig {
    pattern: Regex,
}

#[test]
fn regex_serializes() {
    let config: SerializableRegexConfig = serde_yaml::from_str(r#"pattern: "^[a-z]+$""#).unwrap();
    let yaml = serde_yaml::to_string(&config).unwrap();
    insta::assert_snapshot!(yaml, @"pattern: ^[a-z]+$");
}