// Copyright © 2021 The Radicle Link Contributors // // This file is part of radicle-link, distributed under the GPLv3 with Radicle // Linking Exception. For full terms see the included LICENSE file. use std::convert::TryFrom; use ::serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use crate::{ refspec::{PatternStr, PatternString}, Namespaced, Qualified, RefStr, RefString, }; impl<'de: 'a, 'a> Deserialize<'de> for &'a RefStr { #[inline] fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { Deserialize::deserialize(deserializer) .and_then(|s: &str| Self::try_from(s).map_err(de::Error::custom)) } } impl<'a> Serialize for &'a RefStr { #[inline] fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(self.as_str()) } } impl<'de> Deserialize<'de> for RefString { #[inline] fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { Deserialize::deserialize(deserializer).map(|x: &RefStr| x.to_owned()) } } impl Serialize for RefString { #[inline] fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(self.as_str()) } } impl<'de: 'a, 'a> Deserialize<'de> for &'a PatternStr { #[inline] fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { Deserialize::deserialize(deserializer) .and_then(|s: &str| Self::try_from(s).map_err(de::Error::custom)) } } impl<'a> Serialize for &'a PatternStr { #[inline] fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(self.as_str()) } } impl<'de> Deserialize<'de> for PatternString { #[inline] fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { Deserialize::deserialize(deserializer).map(|x: &PatternStr| x.to_owned()) } } impl Serialize for PatternString { #[inline] fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(self.as_str()) } } impl<'de: 'a, 'a> Deserialize<'de> for Qualified<'a> { #[inline] fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { Deserialize::deserialize(deserializer).and_then(|s: &RefStr| { s.qualified() .ok_or_else(|| de::Error::custom("not a qualified ref")) }) } } impl Serialize for Qualified<'_> { #[inline] fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(self.as_str()) } } impl<'de: 'a, 'a> Deserialize<'de> for Namespaced<'a> { #[inline] fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { Deserialize::deserialize(deserializer).and_then(|s: &RefStr| { s.namespaced() .ok_or_else(|| de::Error::custom("not a namespaced ref")) }) } } impl Serialize for Namespaced<'_> { #[inline] fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(self.as_str()) } }