mod convert;
mod ident;
mod link;
mod object;
mod relationship;
mod specification;
mod error;
use std::iter::FromIterator;
use serde::de::DeserializeOwned;
use serde::ser::Serialize;
use error::Error;
use query::Query;
use sealed::Sealed;
use value::{Key, Map, Set, Value};
use view::Render;
pub use self::convert::*;
pub use self::error::{ErrorObject, ErrorSource};
pub use self::ident::Identifier;
pub use self::link::Link;
pub use self::object::{NewObject, Object};
pub use self::relationship::Relationship;
pub use self::specification::{JsonApi, Version};
pub trait PrimaryData: DeserializeOwned + Sealed + Serialize {
#[doc(hidden)]
fn flatten(self, &Set<Object>) -> Value;
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(bound = "T: PrimaryData", untagged)]
pub enum Document<T: PrimaryData> {
Ok {
data: Data<T>,
#[serde(default, skip_serializing_if = "Set::is_empty")]
included: Set<Object>,
#[serde(default)]
jsonapi: JsonApi,
#[serde(default, skip_serializing_if = "Map::is_empty")]
links: Map<Key, Link>,
#[serde(default, skip_serializing_if = "Map::is_empty")]
meta: Map,
},
Err {
errors: Vec<ErrorObject>,
#[serde(default)]
jsonapi: JsonApi,
#[serde(default, skip_serializing_if = "Map::is_empty")]
links: Map<Key, Link>,
#[serde(default, skip_serializing_if = "Map::is_empty")]
meta: Map,
},
}
impl<T: PrimaryData> Document<T> {
pub fn is_ok(&self) -> bool {
match *self {
Document::Ok { .. } => true,
Document::Err { .. } => false,
}
}
pub fn is_err(&self) -> bool {
match *self {
Document::Ok { .. } => true,
Document::Err { .. } => false,
}
}
}
impl<T: PrimaryData> Render<T> for Document<T> {
fn render(self, _: Option<&Query>) -> Result<Document<T>, Error> {
Ok(self)
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(bound = "T: PrimaryData", untagged)]
pub enum Data<T: PrimaryData> {
Collection(Vec<T>),
Member(Box<Option<T>>),
}
impl<T: PrimaryData> From<Option<T>> for Data<T> {
fn from(value: Option<T>) -> Self {
Data::Member(Box::new(value))
}
}
impl<T: PrimaryData> From<Vec<T>> for Data<T> {
fn from(value: Vec<T>) -> Self {
Data::Collection(value)
}
}
impl<T: PrimaryData> From<T> for Data<T> {
fn from(value: T) -> Self {
Data::Member(Box::new(Some(value)))
}
}
impl<T: PrimaryData> FromIterator<T> for Data<T> {
fn from_iter<I>(iter: I) -> Self
where
I: IntoIterator<Item = T>,
{
Data::Collection(Vec::from_iter(iter))
}
}