#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Resource {
Bundle(Box<super::bundle::Bundle>),
CapabilityStatement(Box<super::capability_statement::CapabilityStatement>),
CodeSystem(Box<super::code_system::CodeSystem>),
ConceptMap(Box<super::concept_map::ConceptMap>),
OperationOutcome(Box<super::operation_outcome::OperationOutcome>),
Parameters(Box<super::parameters::Parameters>),
TerminologyCapabilities(Box<super::terminology_capabilities::TerminologyCapabilities>),
ValueSet(Box<super::value_set::ValueSet>),
Unknown(UnknownResource),
}
impl super::super::codec::Json for Resource {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
match self {
Self::Bundle(inner) => super::super::codec::Json::to_json(inner.as_ref()),
Self::CapabilityStatement(inner) => super::super::codec::Json::to_json(inner.as_ref()),
Self::CodeSystem(inner) => super::super::codec::Json::to_json(inner.as_ref()),
Self::ConceptMap(inner) => super::super::codec::Json::to_json(inner.as_ref()),
Self::OperationOutcome(inner) => super::super::codec::Json::to_json(inner.as_ref()),
Self::Parameters(inner) => super::super::codec::Json::to_json(inner.as_ref()),
Self::TerminologyCapabilities(inner) => {
super::super::codec::Json::to_json(inner.as_ref())
}
Self::ValueSet(inner) => super::super::codec::Json::to_json(inner.as_ref()),
Self::Unknown(inner) => match &inner.body {
super::super::codec::Value::Object(object) => Ok(object.clone()),
_ => Err(super::super::codec::EncodeError::UnknownResourceBody),
},
}
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match super::super::codec::resource_type(object, path)? {
"Bundle" => Ok(Self::Bundle(Box::new(
super::super::codec::Json::from_json(object, path)?,
))),
"CapabilityStatement" => Ok(Self::CapabilityStatement(Box::new(
super::super::codec::Json::from_json(object, path)?,
))),
"CodeSystem" => Ok(Self::CodeSystem(Box::new(
super::super::codec::Json::from_json(object, path)?,
))),
"ConceptMap" => Ok(Self::ConceptMap(Box::new(
super::super::codec::Json::from_json(object, path)?,
))),
"OperationOutcome" => Ok(Self::OperationOutcome(Box::new(
super::super::codec::Json::from_json(object, path)?,
))),
"Parameters" => Ok(Self::Parameters(Box::new(
super::super::codec::Json::from_json(object, path)?,
))),
"TerminologyCapabilities" => Ok(Self::TerminologyCapabilities(Box::new(
super::super::codec::Json::from_json(object, path)?,
))),
"ValueSet" => Ok(Self::ValueSet(Box::new(
super::super::codec::Json::from_json(object, path)?,
))),
other => Ok(Self::Unknown(UnknownResource {
resource_type: other.to_owned(),
body: super::super::codec::Value::Object(object.clone()),
})),
}
}
}
impl serde::Serialize for Resource {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::Bundle(inner) => serde::Serialize::serialize(inner.as_ref(), serializer),
Self::CapabilityStatement(inner) => {
serde::Serialize::serialize(inner.as_ref(), serializer)
}
Self::CodeSystem(inner) => serde::Serialize::serialize(inner.as_ref(), serializer),
Self::ConceptMap(inner) => serde::Serialize::serialize(inner.as_ref(), serializer),
Self::OperationOutcome(inner) => {
serde::Serialize::serialize(inner.as_ref(), serializer)
}
Self::Parameters(inner) => serde::Serialize::serialize(inner.as_ref(), serializer),
Self::TerminologyCapabilities(inner) => {
serde::Serialize::serialize(inner.as_ref(), serializer)
}
Self::ValueSet(inner) => serde::Serialize::serialize(inner.as_ref(), serializer),
Self::Unknown(inner) => match &inner.body {
super::super::codec::Value::Object(object) => {
serde::Serialize::serialize(object, serializer)
}
_ => Err(<S::Error as serde::ser::Error>::custom(
super::super::codec::EncodeError::UnknownResourceBody,
)),
},
}
}
}
impl<'de> serde::Deserialize<'de> for Resource {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = <super::super::codec::Value as serde::Deserialize>::deserialize(deserializer)?;
let mut path = super::super::codec::Path::root("Resource");
let object =
super::super::codec::expect_object(&value, &path).map_err(serde::de::Error::custom)?;
super::super::codec::Json::from_json(object, &mut path).map_err(serde::de::Error::custom)
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct UnknownResource {
pub resource_type: std::string::String,
pub body: super::super::codec::Value,
}