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