pyany_serde/pyany_serde_impl/
tuple_serde.rs1use pyo3::prelude::*;
2use pyo3::types::PyTuple;
3
4use crate::PyAnySerde;
5
6#[derive(Clone)]
7pub struct TupleSerde {
8 pub item_serdes: Vec<Box<dyn PyAnySerde>>,
9}
10
11impl PyAnySerde for TupleSerde {
12 fn append<'py>(
13 &mut self,
14 buf: &mut [u8],
15 mut offset: usize,
16 obj: &Bound<'py, PyAny>,
17 ) -> PyResult<usize> {
18 let tuple = obj.downcast::<PyTuple>()?;
19 for (pyany_serde, item) in self.item_serdes.iter_mut().zip(tuple.iter()) {
20 offset = pyany_serde.append(buf, offset, &item)?;
21 }
22 Ok(offset)
23 }
24
25 fn append_vec<'py>(
26 &mut self,
27 v: &mut Vec<u8>,
28 start_addr: Option<usize>,
29 obj: &Bound<'py, PyAny>,
30 ) -> PyResult<()> {
31 let tuple = obj.downcast::<PyTuple>()?;
32 for (pyany_serde, item) in self.item_serdes.iter_mut().zip(tuple.iter()) {
33 pyany_serde.append_vec(v, start_addr, &item)?;
34 }
35 Ok(())
36 }
37 fn retrieve<'py>(
38 &mut self,
39 py: Python<'py>,
40 buf: &[u8],
41 mut offset: usize,
42 ) -> PyResult<(Bound<'py, PyAny>, usize)> {
43 let mut tuple_vec = Vec::with_capacity(self.item_serdes.len());
44 for pyany_serde in self.item_serdes.iter_mut() {
45 let item;
46 (item, offset) = pyany_serde.retrieve(py, buf, offset)?;
47 tuple_vec.push(item);
48 }
49 Ok((PyTuple::new(py, tuple_vec)?.into_any(), offset))
50 }
51}