apollo-configuration 0.4.0

A typed, friendly configuration system for Apollo products.
Documentation
//! Support for HTTP types in configuration.

use std::borrow::Cow;

use derive_more::{Deref, Display, From, FromStr};
use schemars::JsonSchema;
use serde::de::Deserializer;
use serde::{Deserialize, Serialize};

use crate::Validate;

// =============================================================================
// HeaderName
// =============================================================================

/// An HTTP header name parsed from configuration.
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deref, From, FromStr, Display)]
pub struct HeaderName(http::HeaderName);

impl<'de> Deserialize<'de> for HeaderName {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        s.parse().map_err(serde::de::Error::custom)
    }
}

impl Serialize for HeaderName {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        self.0.as_str().serialize(serializer)
    }
}

impl JsonSchema for HeaderName {
    fn schema_name() -> Cow<'static, str> {
        Cow::Borrowed("HeaderName")
    }

    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
        String::json_schema(generator)
    }
}

impl Validate for HeaderName {}

impl PartialEq<str> for HeaderName {
    fn eq(&self, other: &str) -> bool {
        self.0 == other
    }
}

// =============================================================================
// HeaderValue
// =============================================================================

/// An HTTP header value parsed from configuration.
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deref, From, FromStr)]
pub struct HeaderValue(http::HeaderValue);

impl<'de> Deserialize<'de> for HeaderValue {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        s.parse().map_err(serde::de::Error::custom)
    }
}

impl Serialize for HeaderValue {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        self.0
            .to_str()
            .map_err(serde::ser::Error::custom)?
            .serialize(serializer)
    }
}

impl JsonSchema for HeaderValue {
    fn schema_name() -> Cow<'static, str> {
        Cow::Borrowed("HeaderValue")
    }

    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
        String::json_schema(generator)
    }
}

impl Validate for HeaderValue {}

// =============================================================================
// Method
// =============================================================================

/// An HTTP method parsed from configuration.
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deref, From, FromStr, Display)]
pub struct Method(http::Method);

impl<'de> Deserialize<'de> for Method {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        s.parse().map_err(serde::de::Error::custom)
    }
}

impl Serialize for Method {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        self.0.as_str().serialize(serializer)
    }
}

impl JsonSchema for Method {
    fn schema_name() -> Cow<'static, str> {
        Cow::Borrowed("Method")
    }

    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
        String::json_schema(generator)
    }
}

impl Validate for Method {}

impl PartialEq<str> for Method {
    fn eq(&self, other: &str) -> bool {
        self.0 == other
    }
}

// =============================================================================
// Uri
// =============================================================================

/// An HTTP URI parsed from configuration.
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deref, From, FromStr, Display)]
pub struct Uri(http::Uri);

impl<'de> Deserialize<'de> for Uri {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        s.parse().map_err(serde::de::Error::custom)
    }
}

impl Serialize for Uri {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        self.0.to_string().serialize(serializer)
    }
}

impl JsonSchema for Uri {
    fn schema_name() -> Cow<'static, str> {
        Cow::Borrowed("Uri")
    }

    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
        String::json_schema(generator)
    }
}

impl Validate for Uri {}