pyany_serde/pyany_serde_impl/
option_serde.rs

1use pyo3::prelude::*;
2use pyo3::types::PyNone;
3
4use crate::{
5    communication::{append_bool, append_bool_vec, retrieve_bool},
6    PyAnySerde,
7};
8
9#[derive(Clone)]
10pub struct OptionSerde {
11    pub value_serde: Box<dyn PyAnySerde>,
12}
13
14impl PyAnySerde for OptionSerde {
15    fn append<'py>(
16        &mut self,
17        buf: &mut [u8],
18        mut offset: usize,
19        obj: &Bound<'py, PyAny>,
20    ) -> PyResult<usize> {
21        if obj.is_none() {
22            offset = append_bool(buf, offset, false);
23        } else {
24            offset = append_bool(buf, offset, true);
25            offset = self.value_serde.append(buf, offset, obj)?;
26        }
27        Ok(offset)
28    }
29
30    fn append_vec<'py>(
31        &mut self,
32        v: &mut Vec<u8>,
33        start_addr: Option<usize>,
34        obj: &Bound<'py, PyAny>,
35    ) -> PyResult<()> {
36        if obj.is_none() {
37            append_bool_vec(v, false);
38        } else {
39            append_bool_vec(v, true);
40            self.value_serde.append_vec(v, start_addr, obj)?;
41        }
42        Ok(())
43    }
44
45    fn retrieve<'py>(
46        &mut self,
47        py: Python<'py>,
48        buf: &[u8],
49        offset: usize,
50    ) -> PyResult<(Bound<'py, PyAny>, usize)> {
51        let (is_some, offset) = retrieve_bool(buf, offset)?;
52        if is_some {
53            self.value_serde.retrieve(py, buf, offset)
54        } else {
55            Ok((PyNone::get(py).to_owned().into_any(), offset))
56        }
57    }
58}