substrate_data/schema/plain/
wrappers.rs1use 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}