I have a serde feature flag that i want to enable conditionally, i have this Spanned struct that can be serialized, and i want to enable the constraint of serialization only when the feature flag is enabled.
I can do this easily by duplicating the code but, is there a better way to do it?
//example duplicated code
#[derive(Clone, Debug)]
#[cfg(not(feature = "serde"))]
pub struct Spanned<T>
where
//i'd like to optionally add Serialize here
T: Debug + Clone,
{
pub value: T,
span: Span,
}
//i'd like to optionally add Serialize here
impl<T: Debug + Clone> Spanned<T> {
pub fn new(value: T, span: Span) -> Self {
Self { value, span }
}
pub fn get_span(&self) -> &Span {
&self.span
}
pub fn into_tuple(self) -> (T, Span) {
(self.value, self.span)
}
pub fn get_span_value(&self) -> &T {
&self.value
}
pub fn into_span_value(self) -> T {
self.value
}
}
//example by duplicating code like i'm doing now
#[derive(Clone)]
#[cfg(feature = "serde")]
#[cfg_attr(feature = "serde", derive(Serialize))]
#[cfg_attr(feature = "serde", serde(crate = "serde_renamed"))]
pub struct Spanned<T>
where
T: Debug + Clone + Serialize,
{
pub value: T,
span: Span,
}
impl<T: Debug + Clone + Serialize> Spanned<T> {
...
}