Skip to main content

apollo_configuration/types/
grpc.rs

1//! Support for gRPC types in configuration.
2
3use std::borrow::Cow;
4
5use derive_more::{Deref, Display, From};
6use schemars::JsonSchema;
7use serde::de::Deserializer;
8use serde::{Deserialize, Serialize};
9
10use crate::Validate;
11
12// =============================================================================
13// MetadataKey
14// =============================================================================
15
16/// A gRPC metadata key parsed from configuration.
17#[derive(Debug, Clone, PartialEq, Eq, Hash, Deref, From, Display)]
18pub struct MetadataKey(tonic::metadata::AsciiMetadataKey);
19
20impl<'de> Deserialize<'de> for MetadataKey {
21    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
22    where
23        D: Deserializer<'de>,
24    {
25        let s = String::deserialize(deserializer)?;
26        s.parse::<tonic::metadata::AsciiMetadataKey>()
27            .map(Self)
28            .map_err(serde::de::Error::custom)
29    }
30}
31
32impl Serialize for MetadataKey {
33    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
34    where
35        S: serde::Serializer,
36    {
37        self.0.as_str().serialize(serializer)
38    }
39}
40
41impl JsonSchema for MetadataKey {
42    fn schema_name() -> Cow<'static, str> {
43        Cow::Borrowed("MetadataKey")
44    }
45
46    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
47        String::json_schema(generator)
48    }
49}
50
51impl Validate for MetadataKey {}
52
53// =============================================================================
54// MetadataValue
55// =============================================================================
56
57/// A gRPC metadata value parsed from configuration.
58#[derive(Debug, Clone, PartialEq, Eq, Hash, Deref, From)]
59pub struct MetadataValue(tonic::metadata::AsciiMetadataValue);
60
61impl<'de> Deserialize<'de> for MetadataValue {
62    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
63    where
64        D: Deserializer<'de>,
65    {
66        let s = String::deserialize(deserializer)?;
67        s.parse::<tonic::metadata::AsciiMetadataValue>()
68            .map(Self)
69            .map_err(serde::de::Error::custom)
70    }
71}
72
73impl Serialize for MetadataValue {
74    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
75    where
76        S: serde::Serializer,
77    {
78        self.0
79            .to_str()
80            .map_err(serde::ser::Error::custom)?
81            .serialize(serializer)
82    }
83}
84
85impl JsonSchema for MetadataValue {
86    fn schema_name() -> Cow<'static, str> {
87        Cow::Borrowed("MetadataValue")
88    }
89
90    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
91        String::json_schema(generator)
92    }
93}
94
95impl Validate for MetadataValue {}