1mod convert;
4mod ident;
5mod link;
6mod object;
7mod relationship;
8mod specification;
9
10mod error;
11
12use std::iter::FromIterator;
13
14use serde::de::DeserializeOwned;
15use serde::ser::Serialize;
16
17use error::Error;
18use query::Query;
19use sealed::Sealed;
20use value::{Key, Map, Set, Value};
21use view::Render;
22
23pub use self::convert::*;
24pub use self::error::{ErrorObject, ErrorSource};
25pub use self::ident::Identifier;
26pub use self::link::Link;
27pub use self::object::{NewObject, Object};
28pub use self::relationship::Relationship;
29pub use self::specification::{JsonApi, Version};
30
31pub trait PrimaryData: DeserializeOwned + Sealed + Serialize {
34 #[doc(hidden)]
35 fn flatten(self, &Set<Object>) -> Value;
36}
37
38#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
45#[serde(bound = "T: PrimaryData", untagged)]
46pub enum Document<T: PrimaryData> {
47 Ok {
49 data: Data<T>,
54
55 #[serde(default, skip_serializing_if = "Set::is_empty")]
58 included: Set<Object>,
59
60 #[serde(default)]
66 jsonapi: JsonApi,
67
68 #[serde(default, skip_serializing_if = "Map::is_empty")]
74 links: Map<Key, Link>,
75
76 #[serde(default, skip_serializing_if = "Map::is_empty")]
82 meta: Map,
83 },
84
85 Err {
87 errors: Vec<ErrorObject>,
88
89 #[serde(default)]
90 jsonapi: JsonApi,
91
92 #[serde(default, skip_serializing_if = "Map::is_empty")]
93 links: Map<Key, Link>,
94
95 #[serde(default, skip_serializing_if = "Map::is_empty")]
96 meta: Map,
97 },
98}
99
100impl<T: PrimaryData> Document<T> {
101 pub fn is_ok(&self) -> bool {
103 match *self {
104 Document::Ok { .. } => true,
105 Document::Err { .. } => false,
106 }
107 }
108
109 pub fn is_err(&self) -> bool {
111 match *self {
112 Document::Ok { .. } => true,
113 Document::Err { .. } => false,
114 }
115 }
116}
117
118impl<T: PrimaryData> Render<T> for Document<T> {
119 fn render(self, _: Option<&Query>) -> Result<Document<T>, Error> {
120 Ok(self)
121 }
122}
123
124#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
131#[serde(bound = "T: PrimaryData", untagged)]
132pub enum Data<T: PrimaryData> {
133 Collection(Vec<T>),
135
136 Member(Box<Option<T>>),
138}
139
140impl<T: PrimaryData> From<Option<T>> for Data<T> {
141 fn from(value: Option<T>) -> Self {
142 Data::Member(Box::new(value))
143 }
144}
145
146impl<T: PrimaryData> From<Vec<T>> for Data<T> {
147 fn from(value: Vec<T>) -> Self {
148 Data::Collection(value)
149 }
150}
151
152impl<T: PrimaryData> From<T> for Data<T> {
153 fn from(value: T) -> Self {
154 Data::Member(Box::new(Some(value)))
155 }
156}
157
158impl<T: PrimaryData> FromIterator<T> for Data<T> {
159 fn from_iter<I>(iter: I) -> Self
160 where
161 I: IntoIterator<Item = T>,
162 {
163 Data::Collection(Vec::from_iter(iter))
164 }
165}