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