pyany_serde/pyany_serde_impl/
set_serde.rs1use 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}