Skip to main content

substrate_data/schema/plain/
ordered.rs

1//! [`Ordered`]: an object kept in file order.
2
3use super::maps::read_map;
4use crate::model::borrowed::ValueRef;
5use crate::model::value::Value;
6use crate::schema::{Reader, Schema, Shape};
7
8/// An object kept in file order, values of one schema.
9#[derive(Debug, Clone, PartialEq)]
10pub struct Ordered<T>(pub Vec<(String, T)>);
11
12impl<T> Default for Ordered<T> {
13    fn default() -> Self {
14        Self(Vec::new())
15    }
16}
17
18impl<T: Schema> Schema for Ordered<T> {
19    fn shape() -> Shape {
20        Shape::Map(T::shape)
21    }
22    fn read(v: &ValueRef<'_>, cx: &mut Reader<'_>) -> Option<Self> {
23        let mut out = Vec::new();
24        read_map(v, cx, |k, x| out.push((k, x)))?;
25        Some(Ordered(out))
26    }
27    fn write(&self) -> Value {
28        Value::Map(self.0.iter().map(|(k, v)| (k.clone(), v.write())).collect())
29    }
30}