Use serde attrs instead of manual impls

This commit is contained in:
Nick Mathewson 2022-05-24 10:15:56 -04:00
parent de3c7baa4c
commit 924cc380d4
2 changed files with 14 additions and 28 deletions

View File

@ -98,6 +98,11 @@ fn cur_groups() -> Vec<u32> {
/// correspond to `TrustedUser::Name("jane".into())`.
#[derive(Clone, Debug, educe::Educe, Eq, PartialEq)]
#[educe(Default)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(try_from = "serde_support::Serde", into = "serde_support::Serde")
)]
#[non_exhaustive]
pub enum TrustedUser {
/// We won't treat any user as trusted.
@ -168,6 +173,11 @@ impl TrustedUser {
/// or the map `{ special = ":username" }`.
#[derive(Clone, Debug, educe::Educe, Eq, PartialEq)]
#[educe(Default)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(try_from = "serde_support::Serde", into = "serde_support::Serde")
)]
#[non_exhaustive]
pub enum TrustedGroup {
/// We won't treat any group as trusted

View File

@ -1,11 +1,8 @@
//! Serde support for [`TrustedUser`] and [`TrustedGroup`].
use super::{TrustedGroup, TrustedUser};
use serde::{de::Error as _, Deserialize, Serialize};
use std::{
convert::{TryFrom, TryInto},
ffi::OsString,
};
use serde::{Deserialize, Serialize};
use std::{convert::TryFrom, ffi::OsString};
/// Helper type: when encoding or decoding a group or user, we do so as one of
/// these.
@ -14,7 +11,7 @@ use std::{
/// by type or by keywords.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(untagged)]
enum Serde {
pub(super) enum Serde {
/// A boolean value.
///
/// "false" means "no user", and is the same as "none".
@ -131,28 +128,7 @@ macro_rules! implement_serde {
})
}
}
impl Serialize for $struct {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
Serde::from(self.clone())
.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for $struct {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>
{
Serde::deserialize(deserializer)?
.try_into()
.map_err(|e: crate::Error| D::Error::custom(e.to_string()))
}
}}}
}}
implement_serde! { TrustedUser {
None => ":none",