Skip to main content

substrate_data/schema/plain/
result.rs

1//! The schema of a `Result`: `{ ok }` or `{ err }`.
2
3use crate::model::borrowed::ValueRef;
4use crate::model::value::{Seg, Value};
5use crate::schema::{Expected, Reader, Schema, Shape};
6
7/// The key of a [`Result`]'s success side.
8pub const RESULT_OK: &str = "ok";
9/// The key of a [`Result`]'s failure side.
10pub const RESULT_ERR: &str = "err";
11
12/// What may fail: `{ "ok": T }` or `{ "err": E }`.
13impl<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}