use crate::{ESTree, SequenceSerializer, Serializer};
pub trait ConcatElement {
fn push_to_sequence<S: SequenceSerializer>(&self, seq: &mut S);
}
impl<T: ESTree> ConcatElement for Option<T> {
fn push_to_sequence<S: SequenceSerializer>(&self, seq: &mut S) {
if let Some(value) = self {
seq.serialize_element(value);
}
}
}
pub struct Concat2<'t, C1: ConcatElement, C2: ConcatElement>(pub &'t C1, pub &'t C2);
impl<C1: ConcatElement, C2: ConcatElement> ESTree for Concat2<'_, C1, C2> {
fn serialize<S: Serializer>(&self, serializer: S) {
let mut seq = serializer.serialize_sequence();
self.0.push_to_sequence(&mut seq);
self.1.push_to_sequence(&mut seq);
seq.end();
}
}
pub struct Concat3<'t, C1: ConcatElement, C2: ConcatElement, C3: ConcatElement>(
pub &'t C1,
pub &'t C2,
pub &'t C3,
);
impl<C1: ConcatElement, C2: ConcatElement, C3: ConcatElement> ESTree for Concat3<'_, C1, C2, C3> {
fn serialize<S: Serializer>(&self, serializer: S) {
let mut seq = serializer.serialize_sequence();
self.0.push_to_sequence(&mut seq);
self.1.push_to_sequence(&mut seq);
self.2.push_to_sequence(&mut seq);
seq.end();
}
}