djin_protocol/types/
option.rs1use 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