Skip to main content

cadmpeg_core/
iter_wire.rs

1// SPDX-License-Identifier: Apache-2.0
2//! Serialize borrowed iterator columns without collecting them into vectors.
3
4use serde::ser::SerializeSeq;
5use serde::Serialize;
6
7/// A serializable sequence over a cloneable iterator.
8pub struct IterWire<I>(pub I);
9
10impl<I> Serialize for IterWire<I>
11where
12    I: Iterator + Clone,
13    I::Item: Serialize,
14{
15    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
16        let values = self.0.clone();
17        let (lower, upper) = values.size_hint();
18        let mut sequence = serializer.serialize_seq((upper == Some(lower)).then_some(lower))?;
19        for value in values {
20            sequence.serialize_element(&value)?;
21        }
22        sequence.end()
23    }
24}