substrate_data/schema/plain/
result.rs1use crate::model::borrowed::ValueRef;
4use crate::model::value::{Seg, Value};
5use crate::schema::{Expected, Reader, Schema, Shape};
6
7pub const RESULT_OK: &str = "ok";
9pub const RESULT_ERR: &str = "err";
11
12impl<T: Schema, E: Schema> Schema for Result<T, E> {
14 fn shape() -> Shape {
15 Shape::Any
16 }
17 fn read(v: &ValueRef<'_>, cx: &mut Reader<'_>) -> Option<Self> {
18 let ValueRef::Map(m) = v else {
19 cx.expected(Expected::OkOrErr, v);
20 return None;
21 };
22 if let Some(ok) = m.get(RESULT_OK) {
23 return cx
24 .at(Seg::Key(RESULT_OK.into()), |cx| T::read(ok, cx))
25 .map(Ok);
26 }
27 let Some(err) = m.get(RESULT_ERR) else {
28 cx.expected(Expected::OkOrErr, v);
29 return None;
30 };
31 cx.at(Seg::Key(RESULT_ERR.into()), |cx| E::read(err, cx))
32 .map(Err)
33 }
34 fn write(&self) -> Value {
35 let (key, value) = match self {
36 Ok(t) => (RESULT_OK, t.write()),
37 Err(e) => (RESULT_ERR, e.write()),
38 };
39 Value::Map([(key.to_owned(), value)].into_iter().collect())
40 }
41}