stencila_schema/
prelude.rs1use chrono::{DateTime, Utc};
2pub use defaults::Defaults;
3pub use serde::{Deserialize, Serialize};
4pub use serde_json::Value;
5pub use serde_with::skip_serializing_none;
6pub use std::{
7 collections::BTreeMap,
8 convert::AsRef,
9 fmt::{self, Display},
10 sync::Arc,
11};
12pub use strum::AsRefStr;
13
14#[derive(Clone, Debug)]
20pub struct Null {}
21
22impl Display for Null {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 write!(f, "null")
25 }
26}
27
28impl Serialize for Null {
29 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30 where
31 S: serde::Serializer,
32 {
33 serializer.serialize_none()
34 }
35}
36
37impl<'de> Deserialize<'de> for Null {
38 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
39 where
40 D: serde::Deserializer<'de>,
41 {
42 let value = serde_json::Value::deserialize(deserializer)?;
43 match value.is_null() {
44 true => Ok(Null {}),
45 false => Err(serde::de::Error::custom("Expected a null value")),
46 }
47 }
48}
49
50pub type Boolean = bool;
52
53pub type Integer = i64;
57
58pub type Number = f64;
62
63pub type Array = Vec<Primitive>;
65
66pub type Object = BTreeMap<String, Primitive>;
70
71#[derive(Clone, Debug, Serialize, Deserialize)]
73#[serde(untagged)]
74pub enum Primitive {
75 Null(Null),
76 Boolean(Boolean),
77 Integer(Integer),
78 Number(Number),
79 String(String),
80 Object(Object),
81 Array(Array),
82}
83
84#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
90pub struct Cord(pub String);
91
92impl From<DateTime<Utc>> for crate::Date {
95 fn from(date_time: DateTime<Utc>) -> Self {
96 Self {
97 value: date_time.to_rfc3339(),
98 ..Default::default()
99 }
100 }
101}
102
103impl crate::Date {
104 pub fn now() -> Self {
105 Self {
106 value: Utc::now().to_rfc3339(),
107 ..Default::default()
108 }
109 }
110}