pyany_serde/pyany_serde_impl/
tuple_serde.rs

1use 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}