diff --git a/crates/topola-rules/src/lib.rs b/crates/topola-rules/src/lib.rs index 0228aa1..91df585 100644 --- a/crates/topola-rules/src/lib.rs +++ b/crates/topola-rules/src/lib.rs @@ -12,13 +12,12 @@ use alloc::borrow::Cow; use core::ops; #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] -#[cfg_attr(feature = "serde", serde(from = "(T, T)", into = "(T, T)"))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", serde(from = "(T, T)", into = "&(T, T)"))] #[cfg_attr( feature = "serde", serde(bound( deserialize = "T: serde::Deserialize<'de> + Ord", - serialize = "T: serde::Serialize + Clone" )) )] pub struct OrderedPair(T, T); @@ -49,6 +48,34 @@ impl From> for (T, T) { } } +impl<'a, T> From<&'a OrderedPair> for (&'a T, &'a T) { + #[inline(always)] + fn from(OrderedPair(a, b): &'a OrderedPair) -> (&'a T, &'a T) { + (a, b) + } +} + +#[cfg(feature = "serde")] +impl serde::Serialize for OrderedPair { + #[inline] + fn serialize(&self, serializer: S) -> Result { + use serde::ser::SerializeTuple; + let mut tuple = match serializer.serialize_tuple(2) { + Ok(x) => x, + Err(e) => return Err(e), + }; + match tuple.serialize_element(&self.0) { + Ok(x) => x, + Err(e) => return Err(e), + } + match tuple.serialize_element(&self.1) { + Ok(x) => x, + Err(e) => return Err(e), + } + tuple.end() + } +} + #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub struct Conditions<'a, K> {