pyany_serde/pyany_serde_impl/
set_serde.rs

1use pyo3::prelude::*;
2use pyo3::types::PySet;
3
4use crate::{
5    communication::{append_usize, append_usize_vec, retrieve_usize},
6    PyAnySerde,
7};
8
9#[derive(Clone)]
10pub struct SetSerde {
11    pub items_serde: Box<dyn PyAnySerde>,
12}
13
14impl PyAnySerde for SetSerde {
15    fn append<'py>(
16        &mut self,
17        buf: &mut [u8],
18        offset: usize,
19        obj: &Bound<'py, PyAny>,
20    ) -> PyResult<usize> {
21        let set = obj.downcast::<PySet>()?;
22        let mut offset = append_usize(buf, offset, set.len());
23        for item in set.iter() {
24            offset = self.items_serde.append(buf, offset, &item)?;
25        }
26        Ok(offset)
27    }
28
29    fn append_vec<'py>(
30        &mut self,
31        v: &mut Vec<u8>,
32        start_addr: Option<usize>,
33        obj: &Bound<'py, PyAny>,
34    ) -> PyResult<()> {
35        let set = obj.downcast::<PySet>()?;
36        append_usize_vec(v, set.len());
37        for item in set.iter() {
38            self.items_serde.append_vec(v, start_addr, &item)?;
39        }
40        Ok(())
41    }
42
43    fn retrieve<'py>(
44        &mut self,
45        py: Python<'py>,
46        buf: &[u8],
47        offset: usize,
48    ) -> PyResult<(Bound<'py, PyAny>, usize)> {
49        let set = PySet::empty(py)?;
50        let (n_items, mut offset) = retrieve_usize(buf, offset)?;
51        for _ in 0..n_items {
52            let item;
53            (item, offset) = self.items_serde.retrieve(py, buf, offset)?;
54            set.add(item)?;
55        }
56        Ok((set.into_any(), offset))
57    }
58}