add RepeatedSerialize & RepeatedDeserialize

This commit is contained in:
Luna Yao
2026-05-14 02:37:16 +02:00
parent e31fee1a6d
commit 8485091614
2 changed files with 68 additions and 27 deletions
+5 -3
View File
@@ -1,5 +1,5 @@
use crate::proto; use crate::proto;
use crate::proto::utils::RepeatedMessageModel; use crate::proto::utils::{RepeatedDeserialize, RepeatedMessageModel, RepeatedSerialize};
use anyhow::{Error, anyhow}; use anyhow::{Error, anyhow};
use hickory_net::xfer::Protocol; use hickory_net::xfer::Protocol;
use hickory_resolver::config::{ConnectionConfig, NameServerConfig, ProtocolConfig}; use hickory_resolver::config::{ConnectionConfig, NameServerConfig, ProtocolConfig};
@@ -149,8 +149,10 @@ impl From<u16> for NameServerAddrGroup {
} }
} }
impl<'de> Deserialize<'de> for NameServerAddrGroup { impl RepeatedSerialize for NameServerAddr {}
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
impl<'de> RepeatedDeserialize<'de> for NameServerAddr {
fn deserialize<D>(deserializer: D) -> Result<NameServerAddrGroup, D::Error>
where where
D: Deserializer<'de>, D: Deserializer<'de>,
{ {
+63 -24
View File
@@ -2,7 +2,7 @@ use delegate::delegate;
use derivative::Derivative; use derivative::Derivative;
use derive_more::{AsMut, AsRef, Deref, DerefMut, From, IntoIterator}; use derive_more::{AsMut, AsRef, Deref, DerefMut, From, IntoIterator};
use prost::Message; use prost::Message;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Deserializer, Serialize, Serializer};
use sha2::{Digest, Sha256}; use sha2::{Digest, Sha256};
/// Generates a stable digest strictly within the lifecycle of the current process. /// Generates a stable digest strictly within the lifecycle of the current process.
@@ -36,43 +36,27 @@ where
} }
#[derive( #[derive(
Derivative, Derivative, Debug, Clone, PartialEq, Eq, Hash, From, Deref, DerefMut, AsRef, AsMut, IntoIterator,
Debug,
Clone,
PartialEq,
Eq,
Hash,
From,
Deref,
DerefMut,
AsRef,
AsMut,
Serialize,
Deserialize,
IntoIterator,
)] )]
#[derivative(Default(bound = ""))] #[derivative(Default(bound = ""))]
#[as_ref(forward)] #[as_ref(forward)]
#[as_mut(forward)] #[as_mut(forward)]
#[serde(transparent)]
#[into_iterator(owned, ref, ref_mut)] #[into_iterator(owned, ref, ref_mut)]
pub struct RepeatedMessageModel<Model>(Vec<Model>); pub struct RepeatedMessageModel<Model> {
pub models: Vec<Model>,
impl<Model> RepeatedMessageModel<Model> {
pub fn into_inner(self) -> Vec<Model> {
self.0
}
} }
impl<Model> FromIterator<Model> for RepeatedMessageModel<Model> { impl<Model> FromIterator<Model> for RepeatedMessageModel<Model> {
fn from_iter<I: IntoIterator<Item = Model>>(iter: I) -> Self { fn from_iter<I: IntoIterator<Item = Model>>(iter: I) -> Self {
Self(iter.into_iter().collect()) Self {
models: iter.into_iter().collect(),
}
} }
} }
impl<Model> Extend<Model> for RepeatedMessageModel<Model> { impl<Model> Extend<Model> for RepeatedMessageModel<Model> {
delegate! { delegate! {
to self.0 { to self.models {
fn extend<T: IntoIterator<Item = Model>>(&mut self, iter: T); fn extend<T: IntoIterator<Item = Model>>(&mut self, iter: T);
} }
} }
@@ -99,3 +83,58 @@ where
value.into_iter().map(Into::into).collect() value.into_iter().map(Into::into).collect()
} }
} }
pub trait RepeatedSerialize: Serialize + Sized {
fn serialize<S>(models: &RepeatedMessageModel<Self>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
Serialize::serialize(&**models, serializer)
}
}
pub trait RepeatedDeserialize<'de>: Deserialize<'de> {
fn deserialize<D>(deserializer: D) -> Result<RepeatedMessageModel<Self>, D::Error>
where
D: Deserializer<'de>,
{
Vec::deserialize(deserializer).map(Into::into)
}
#[doc(hidden)]
fn deserialize_in_place<D>(
deserializer: D,
place: &mut RepeatedMessageModel<Self>,
) -> Result<(), D::Error>
where
D: Deserializer<'de>,
{
Deserialize::deserialize_in_place(deserializer, &mut place.models)
}
}
impl<Model: RepeatedSerialize> Serialize for RepeatedMessageModel<Model> {
delegate! {
#[through(RepeatedSerialize)]
to self {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer;
}
}
}
impl<'de, Model: RepeatedDeserialize<'de>> Deserialize<'de> for RepeatedMessageModel<Model> {
delegate! {
to RepeatedDeserialize {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>;
#[doc(hidden)]
fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
where
D: Deserializer<'de>;
}
}
}