diff --git a/crates/fs-mistrust/src/user.rs b/crates/fs-mistrust/src/user.rs index ac8ccf172..b85056b28 100644 --- a/crates/fs-mistrust/src/user.rs +++ b/crates/fs-mistrust/src/user.rs @@ -98,6 +98,11 @@ fn cur_groups() -> Vec { /// 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 diff --git a/crates/fs-mistrust/src/user/serde_support.rs b/crates/fs-mistrust/src/user/serde_support.rs index d6ededb15..3e0f43e82 100644 --- a/crates/fs-mistrust/src/user/serde_support.rs +++ b/crates/fs-mistrust/src/user/serde_support.rs @@ -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(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - Serde::from(self.clone()) - .serialize(serializer) - } - } - - impl<'de> Deserialize<'de> for $struct { - fn deserialize(deserializer: D) -> Result - 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",