djin_protocol/types/
option.rs

1use crate::{hint, Parcel, Error, Settings};
2
3use std::io::prelude::*;
4
5impl<T: Parcel> Parcel for Option<T>
6{
7    const TYPE_NAME: &'static str = "Option<T>";
8
9    fn read_field(read: &mut dyn Read,
10                  settings: &Settings,
11                  hints: &mut hint::Hints) -> Result<Self, Error> {
12        if let Some(skip) = hints.skip_hint {
13            if skip {
14                Ok(None)
15            } else {
16                Ok(Some(T::read_field(read, settings, hints)?))
17            }
18        } else {
19            let is_some = bool::read(read, settings)?;
20
21            if is_some {
22                let value = T::read(read, settings)?;
23                Ok(Some(value))
24            } else {
25                Ok(None)
26            }
27        }
28    }
29
30    fn write_field(&self, write: &mut dyn Write,
31                   settings: &Settings,
32                   _: &mut hint::Hints) -> Result<(), Error> {
33        self.is_some().write(write, settings)?;
34
35        if let Some(ref value) = *self {
36            value.write(write, settings)?;
37        }
38
39        Ok(())
40    }
41}
42