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 keys of a [`Result`]'s two sides.
8pub(crate) const RESULT_OK: &str = "ok";
9pub(crate) const RESULT_ERR: &str = "err";
10
11/// What may fail: `{ "ok": T }` or `{ "err": E }`.
12impl<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}