preserves_schema/support/
mod.rs1#[doc(hidden)]
4pub use lazy_static::lazy_static;
6
7pub use preserves;
8pub use preserves::boundary as B;
9pub use preserves::Error;
10pub use preserves::Reader;
11pub use preserves::ReaderResult;
12pub use preserves::SyntaxError;
13
14pub mod interpret;
15
16use preserves::Domain;
17use preserves::ExpectedKind;
18use preserves::IOValue;
19use preserves::NoEmbeddedDomainCodec;
20use preserves::Value;
21use preserves::packed::Packed;
22
23use std::convert::From;
24use std::convert::Into;
25use std::convert::TryFrom;
26
27pub trait ValueCodec {} impl ValueCodec for () {}
30
31pub trait Parse<L, D: Domain>: Sized {
35 fn parse(language: L, value: &Value<D>) -> ReaderResult<Self>;
38}
39
40impl<'a, T: ValueCodec, D: Domain> Parse<&'a T, D> for Value<D> {
41 fn parse(_language: &'a T, value: &Value<D>) -> ReaderResult<Self> {
42 Ok(value.clone())
43 }
44}
45
46pub trait Unparse<L, D: Domain> {
49 fn unparse(&self, language: L) -> Value<D>;
51}
52
53impl<'a, T: ValueCodec, D: Domain> Unparse<&'a T, D> for Value<D> {
54 fn unparse(&self, _language: &'a T) -> Value<D> {
55 self.clone()
56 }
57}
58
59pub trait Codec<D: Domain> {
62 fn parse<'a, T: Parse<&'a Self, D>>(&'a self, value: &Value<D>) -> ReaderResult<T>;
65 fn unparse<'a, T: Unparse<&'a Self, D>>(&'a self, value: &T) -> Value<D>;
67}
68
69impl<L, D: Domain> Codec<D> for L {
70 fn parse<'a, T: Parse<&'a L, D>>(&'a self, value: &Value<D>) -> ReaderResult<T> {
71 T::parse(self, value)
72 }
73
74 fn unparse<'a, T: Unparse<&'a L, D>>(&'a self, value: &T) -> Value<D> {
75 value.unparse(self)
76 }
77}
78
79pub trait Deserialize<D: Domain>
85where
86 Self: Sized,
87{
88 fn deserialize<
89 'de,
90 R: Reader<'de> + ?Sized,
91 Dec: preserves::DomainDecode<D>
92 >(r: &mut R, dec: &mut Dec) -> ReaderResult<Self>;
93}
94
95pub fn decode_lit<D: Domain, P: Packed + 'static>(bs: P) -> ReaderResult<Value<D>> {
98 preserves::packed::view(bs, &mut NoEmbeddedDomainCodec, false)
99}
100
101pub fn decode_embedded<D: Domain>(v: &IOValue) -> ReaderResult<Value<D>>
104where
105 for<'a> D: TryFrom<&'a IOValue, Error = Error>,
106{
107 preserves::value_deepcopy_via(v.into(), &mut |d| Ok(Value::new(preserves::Embedded::new(D::try_from(d)?))))
108}
109
110pub fn encode_embedded<D: Domain>(v: &Value<D>) -> IOValue
113where
114 for<'a> IOValue: From<&'a D>,
115{
116 preserves::value_deepcopy_via(v, &mut |d| Result::<_, std::convert::Infallible>::Ok(
117 IOValue::new(preserves::Embedded::new(IOValue::from(d)))))
118 .unwrap().into()
119}
120
121pub fn is_syntax_error(e: &Error) -> bool {
123 matches!(e, Error::SyntaxError { .. })
124}
125
126pub fn _expect<T>(r: Result<T, ExpectedKind>) -> ReaderResult<T> {
127 r.map_err(|e| SyntaxError::Expected(e).at(None))
128}
129