Skip to main content

substrate_data/schema/plain/
wrappers.rs

1//! The schemas of `Option` and `Box`: their content's.
2
3use crate::binary::{Decoder, Writer};
4use crate::frame::{Packer, Unpacker};
5use crate::model::borrowed::ValueRef;
6use crate::model::value::Value;
7use crate::schema::{Reader, Schema, Shape};
8
9impl<T: Schema> Schema for Option<T> {
10    fn shape() -> Shape {
11        Shape::Optional(T::shape)
12    }
13    fn read(v: &ValueRef<'_>, cx: &mut Reader<'_>) -> Option<Self> {
14        if v.is_null() {
15            Some(None)
16        } else {
17            T::read(v, cx).map(Some)
18        }
19    }
20    fn write(&self) -> Value {
21        self.as_ref().map_or(Value::Null, T::write)
22    }
23    fn write_text(&self, w: &mut crate::text::Writer) {
24        match self {
25            Some(v) => v.write_text(w),
26            None => {
27                w.null();
28            }
29        }
30    }
31    fn encode(&self, w: &mut Writer) {
32        match self {
33            Some(v) => v.encode(w),
34            None => {
35                w.null();
36            }
37        }
38    }
39    fn decode(d: &mut Decoder<'_>) -> Option<Self> {
40        if d.null() {
41            Some(None)
42        } else {
43            T::decode(d).map(Some)
44        }
45    }
46    fn pack(&self, p: &mut Packer) {
47        p.put_bool(self.is_some());
48        if let Some(v) = self {
49            v.pack(p);
50        }
51    }
52    fn unpack(u: &mut Unpacker<'_>) -> Option<Self> {
53        if u.bool()? {
54            T::unpack(u).map(Some)
55        } else {
56            Some(None)
57        }
58    }
59    fn absent() -> Option<Self> {
60        Some(None)
61    }
62    fn skip(&self) -> bool {
63        self.is_none()
64    }
65}
66
67impl<T: Schema> Schema for Box<T> {
68    fn shape() -> Shape {
69        T::shape()
70    }
71    fn read(v: &ValueRef<'_>, cx: &mut Reader<'_>) -> Option<Self> {
72        T::read(v, cx).map(Box::new)
73    }
74    fn write(&self) -> Value {
75        (**self).write()
76    }
77    fn write_text(&self, w: &mut crate::text::Writer) {
78        (**self).write_text(w);
79    }
80    fn encode(&self, w: &mut Writer) {
81        (**self).encode(w);
82    }
83    fn decode(d: &mut Decoder<'_>) -> Option<Self> {
84        T::decode(d).map(Box::new)
85    }
86    fn pack(&self, p: &mut Packer) {
87        (**self).pack(p);
88    }
89    fn unpack(u: &mut Unpacker<'_>) -> Option<Self> {
90        T::unpack(u).map(Box::new)
91    }
92    fn absent() -> Option<Self> {
93        T::absent().map(Box::new)
94    }
95    fn skip(&self) -> bool {
96        (**self).skip()
97    }
98}