use serde::{ ser::{SerializeSeq, SerializeTuple}, Serialize, Serializer, }; #[cfg(all(test, RUSTC_WITH_SPECIALIZATION))] use solana_frozen_abi::abi_example::IgnoreAsHelper; // consumes an iterator and returns an object that will serialize as a serde seq #[allow(dead_code)] pub fn serialize_iter_as_seq(iter: I) -> impl Serialize where I: IntoIterator, ::Item: Serialize, ::IntoIter: ExactSizeIterator, { struct SerializableSequencedIterator { iter: std::cell::RefCell>, } #[cfg(all(test, RUSTC_WITH_SPECIALIZATION))] impl IgnoreAsHelper for SerializableSequencedIterator {} impl Serialize for SerializableSequencedIterator where I: IntoIterator, ::Item: Serialize, ::IntoIter: ExactSizeIterator, { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let iter = self.iter.borrow_mut().take().unwrap().into_iter(); let mut seq = serializer.serialize_seq(Some(iter.len()))?; for item in iter { seq.serialize_element(&item)?; } seq.end() } } SerializableSequencedIterator { iter: std::cell::RefCell::new(Some(iter)), } } // consumes an iterator and returns an object that will serialize as a serde tuple #[allow(dead_code)] pub fn serialize_iter_as_tuple(iter: I) -> impl Serialize where I: IntoIterator, ::Item: Serialize, ::IntoIter: ExactSizeIterator, { struct SerializableSequencedIterator { iter: std::cell::RefCell>, } #[cfg(all(test, RUSTC_WITH_SPECIALIZATION))] impl IgnoreAsHelper for SerializableSequencedIterator {} impl Serialize for SerializableSequencedIterator where I: IntoIterator, ::Item: Serialize, ::IntoIter: ExactSizeIterator, { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let iter = self.iter.borrow_mut().take().unwrap().into_iter(); let mut tup = serializer.serialize_tuple(iter.len())?; for item in iter { tup.serialize_element(&item)?; } tup.end() } } SerializableSequencedIterator { iter: std::cell::RefCell::new(Some(iter)), } } // consumes a 2-tuple iterator and returns an object that will serialize as a serde map #[allow(dead_code)] pub fn serialize_iter_as_map(iter: I) -> impl Serialize where K: Serialize, V: Serialize, I: IntoIterator, { struct SerializableMappedIterator { iter: std::cell::RefCell>, } #[cfg(all(test, RUSTC_WITH_SPECIALIZATION))] impl IgnoreAsHelper for SerializableMappedIterator {} impl Serialize for SerializableMappedIterator where K: Serialize, V: Serialize, I: IntoIterator, { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.collect_map(self.iter.borrow_mut().take().unwrap()) } } SerializableMappedIterator { iter: std::cell::RefCell::new(Some(iter)), } }