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

#[configuration]
struct GrpcConfig {
    #[config(required)]
    metadata_key: MetadataKey,
    #[config(required)]
    metadata_value: MetadataValue,
}

#[test]
fn grpc_types_parse() {
    let config: GrpcConfig = parse_yaml(
        r#"
        metadata_key: x-custom-header
        metadata_value: some-value
        "#,
        &Default::default(),
    )
    .unwrap();

    assert_eq!(config.metadata_key.as_str(), "x-custom-header");
    assert_eq!(config.metadata_value.to_str().unwrap(), "some-value");
}

#[test]
fn metadata_key_error_message() {
    #[configuration]
    struct MetadataKeyOnly {
        #[config(required)]
        key: MetadataKey,
    }

    let result = parse_yaml::<MetadataKeyOnly>("key: \"invalid key\"", &Default::default());
    let err = result.expect_err("should fail to parse invalid metadata key");
    assert_eq!(
        format!("{err}"),
        "failed to parse value: invalid gRPC metadata key name"
    );
}

#[test]
fn metadata_value_error_message() {
    #[configuration]
    struct MetadataValueOnly {
        #[config(required)]
        value: MetadataValue,
    }

    let result =
        parse_yaml::<MetadataValueOnly>("value: \"invalid\\x00value\"", &Default::default());
    let err = result.expect_err("should fail to parse invalid metadata value");
    assert_eq!(
        format!("{err}"),
        "failed to parse value: failed to parse metadata value"
    );
}

#[derive(Debug, Deserialize, Serialize)]
struct SerializableGrpcConfig {
    metadata_key: MetadataKey,
    metadata_value: MetadataValue,
}

#[test]
fn grpc_types_serialize() {
    let config: SerializableGrpcConfig = serde_yaml::from_str(
        r#"
        metadata_key: x-custom-header
        metadata_value: some-value
        "#,
    )
    .unwrap();
    let yaml = serde_yaml::to_string(&config).unwrap();
    insta::assert_snapshot!(yaml, @r"
    metadata_key: x-custom-header
    metadata_value: some-value
    ");
}