#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Contract {
pub id: Option<std::string::String>,
pub meta: Option<super::meta::Meta>,
pub implicit_rules: Option<super::primitives::Uri>,
pub language: Option<super::primitives::Code>,
pub text: Option<super::narrative::Narrative>,
pub contained: Vec<super::resource::Resource>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub identifier: Vec<super::identifier::Identifier>,
pub url: Option<super::primitives::Uri>,
pub version: Option<super::primitives::String>,
pub status: Option<super::primitives::Code>,
pub legal_state: Option<super::codeable_concept::CodeableConcept>,
pub instantiates_canonical: Option<super::reference::Reference>,
pub instantiates_uri: Option<super::primitives::Uri>,
pub content_derivative: Option<super::codeable_concept::CodeableConcept>,
pub issued: Option<super::primitives::DateTime>,
pub applies: Option<super::period::Period>,
pub expiration_type: Option<super::codeable_concept::CodeableConcept>,
pub subject: Vec<super::reference::Reference>,
pub authority: Vec<super::reference::Reference>,
pub domain: Vec<super::reference::Reference>,
pub site: Vec<super::reference::Reference>,
pub name: Option<super::primitives::String>,
pub title: Option<super::primitives::String>,
pub subtitle: Option<super::primitives::String>,
pub alias: Vec<super::primitives::String>,
pub author: Option<super::reference::Reference>,
pub scope: Option<super::codeable_concept::CodeableConcept>,
pub topic: Option<ContractTopic>,
pub r#type: Option<super::codeable_concept::CodeableConcept>,
pub sub_type: Vec<super::codeable_concept::CodeableConcept>,
pub content_definition: Option<ContractContentDefinition>,
pub term: Vec<ContractTerm>,
pub supporting_info: Vec<super::reference::Reference>,
pub relevant_history: Vec<super::reference::Reference>,
pub signer: Vec<ContractSigner>,
pub friendly: Vec<ContractFriendly>,
pub legal: Vec<ContractLegal>,
pub rule: Vec<ContractRule>,
pub legally_binding: Option<ContractLegallyBinding>,
}
impl super::super::codec::Json for Contract {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
object.insert(
std::string::String::from("resourceType"),
super::super::codec::Value::String(std::string::String::from("Contract")),
);
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if let Some(item) = &self.meta {
object.insert(
std::string::String::from("meta"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.implicit_rules {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("implicitRules"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_implicitRules"), e);
}
}
if let Some(item) = &self.language {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("language"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_language"), e);
}
}
if let Some(item) = &self.text {
object.insert(
std::string::String::from("text"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.contained.is_empty() {
let mut items = Vec::with_capacity(self.contained.len());
for item in &self.contained {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("contained"),
super::super::codec::Value::Array(items),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if !self.identifier.is_empty() {
let mut items = Vec::with_capacity(self.identifier.len());
for item in &self.identifier {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("identifier"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.url {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("url"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_url"), e);
}
}
if let Some(item) = &self.version {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("version"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_version"), e);
}
}
if let Some(item) = &self.status {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("status"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_status"), e);
}
}
if let Some(item) = &self.legal_state {
object.insert(
std::string::String::from("legalState"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.instantiates_canonical {
object.insert(
std::string::String::from("instantiatesCanonical"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.instantiates_uri {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("instantiatesUri"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_instantiatesUri"), e);
}
}
if let Some(item) = &self.content_derivative {
object.insert(
std::string::String::from("contentDerivative"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.issued {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("issued"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_issued"), e);
}
}
if let Some(item) = &self.applies {
object.insert(
std::string::String::from("applies"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.expiration_type {
object.insert(
std::string::String::from("expirationType"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.subject.is_empty() {
let mut items = Vec::with_capacity(self.subject.len());
for item in &self.subject {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("subject"),
super::super::codec::Value::Array(items),
);
}
if !self.authority.is_empty() {
let mut items = Vec::with_capacity(self.authority.len());
for item in &self.authority {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("authority"),
super::super::codec::Value::Array(items),
);
}
if !self.domain.is_empty() {
let mut items = Vec::with_capacity(self.domain.len());
for item in &self.domain {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("domain"),
super::super::codec::Value::Array(items),
);
}
if !self.site.is_empty() {
let mut items = Vec::with_capacity(self.site.len());
for item in &self.site {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("site"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.name {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("name"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_name"), e);
}
}
if let Some(item) = &self.title {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("title"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_title"), e);
}
}
if let Some(item) = &self.subtitle {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("subtitle"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_subtitle"), e);
}
}
if !self.alias.is_empty() {
let (values, elements) = super::super::codec::primitive_arrays(&self.alias)?;
object.insert(std::string::String::from("alias"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_alias"), elements);
}
}
if let Some(item) = &self.author {
object.insert(
std::string::String::from("author"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.scope {
object.insert(
std::string::String::from("scope"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.topic {
let (suffix, value, element) = item.to_json_parts()?;
if let Some(value) = value {
object.insert(format!("topic{suffix}"), value);
}
if let Some(element) = element {
object.insert(format!("_topic{suffix}"), element);
}
}
if let Some(item) = &self.r#type {
object.insert(
std::string::String::from("type"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.sub_type.is_empty() {
let mut items = Vec::with_capacity(self.sub_type.len());
for item in &self.sub_type {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("subType"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.content_definition {
object.insert(
std::string::String::from("contentDefinition"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.term.is_empty() {
let mut items = Vec::with_capacity(self.term.len());
for item in &self.term {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("term"),
super::super::codec::Value::Array(items),
);
}
if !self.supporting_info.is_empty() {
let mut items = Vec::with_capacity(self.supporting_info.len());
for item in &self.supporting_info {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("supportingInfo"),
super::super::codec::Value::Array(items),
);
}
if !self.relevant_history.is_empty() {
let mut items = Vec::with_capacity(self.relevant_history.len());
for item in &self.relevant_history {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("relevantHistory"),
super::super::codec::Value::Array(items),
);
}
if !self.signer.is_empty() {
let mut items = Vec::with_capacity(self.signer.len());
for item in &self.signer {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("signer"),
super::super::codec::Value::Array(items),
);
}
if !self.friendly.is_empty() {
let mut items = Vec::with_capacity(self.friendly.len());
for item in &self.friendly {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("friendly"),
super::super::codec::Value::Array(items),
);
}
if !self.legal.is_empty() {
let mut items = Vec::with_capacity(self.legal.len());
for item in &self.legal {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("legal"),
super::super::codec::Value::Array(items),
);
}
if !self.rule.is_empty() {
let mut items = Vec::with_capacity(self.rule.len());
for item in &self.rule {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("rule"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.legally_binding {
let (suffix, value, element) = item.to_json_parts()?;
if let Some(value) = value {
object.insert(format!("legallyBinding{suffix}"), value);
}
if let Some(element) = element {
object.insert(format!("_legallyBinding{suffix}"), element);
}
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_meta: Option<&super::super::codec::Value> = None;
let mut raw_implicit_rules: Option<&super::super::codec::Value> = None;
let mut raw_implicit_rules_element: Option<&super::super::codec::Value> = None;
let mut raw_language: Option<&super::super::codec::Value> = None;
let mut raw_language_element: Option<&super::super::codec::Value> = None;
let mut raw_text: Option<&super::super::codec::Value> = None;
let mut raw_contained: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_identifier: Option<&super::super::codec::Value> = None;
let mut raw_url: Option<&super::super::codec::Value> = None;
let mut raw_url_element: Option<&super::super::codec::Value> = None;
let mut raw_version: Option<&super::super::codec::Value> = None;
let mut raw_version_element: Option<&super::super::codec::Value> = None;
let mut raw_status: Option<&super::super::codec::Value> = None;
let mut raw_status_element: Option<&super::super::codec::Value> = None;
let mut raw_legal_state: Option<&super::super::codec::Value> = None;
let mut raw_instantiates_canonical: Option<&super::super::codec::Value> = None;
let mut raw_instantiates_uri: Option<&super::super::codec::Value> = None;
let mut raw_instantiates_uri_element: Option<&super::super::codec::Value> = None;
let mut raw_content_derivative: Option<&super::super::codec::Value> = None;
let mut raw_issued: Option<&super::super::codec::Value> = None;
let mut raw_issued_element: Option<&super::super::codec::Value> = None;
let mut raw_applies: Option<&super::super::codec::Value> = None;
let mut raw_expiration_type: Option<&super::super::codec::Value> = None;
let mut raw_subject: Option<&super::super::codec::Value> = None;
let mut raw_authority: Option<&super::super::codec::Value> = None;
let mut raw_domain: Option<&super::super::codec::Value> = None;
let mut raw_site: Option<&super::super::codec::Value> = None;
let mut raw_name: Option<&super::super::codec::Value> = None;
let mut raw_name_element: Option<&super::super::codec::Value> = None;
let mut raw_title: Option<&super::super::codec::Value> = None;
let mut raw_title_element: Option<&super::super::codec::Value> = None;
let mut raw_subtitle: Option<&super::super::codec::Value> = None;
let mut raw_subtitle_element: Option<&super::super::codec::Value> = None;
let mut raw_alias: Option<&super::super::codec::Value> = None;
let mut raw_alias_element: Option<&super::super::codec::Value> = None;
let mut raw_author: Option<&super::super::codec::Value> = None;
let mut raw_scope: Option<&super::super::codec::Value> = None;
let mut raw_topic = super::super::codec::ChoiceSlot::default();
let mut raw_type: Option<&super::super::codec::Value> = None;
let mut raw_sub_type: Option<&super::super::codec::Value> = None;
let mut raw_content_definition: Option<&super::super::codec::Value> = None;
let mut raw_term: Option<&super::super::codec::Value> = None;
let mut raw_supporting_info: Option<&super::super::codec::Value> = None;
let mut raw_relevant_history: Option<&super::super::codec::Value> = None;
let mut raw_signer: Option<&super::super::codec::Value> = None;
let mut raw_friendly: Option<&super::super::codec::Value> = None;
let mut raw_legal: Option<&super::super::codec::Value> = None;
let mut raw_rule: Option<&super::super::codec::Value> = None;
let mut raw_legally_binding = super::super::codec::ChoiceSlot::default();
for (key, value) in object {
match key.as_str() {
"resourceType" => {
if value.as_str() != Some("Contract") {
return Err(path.error(super::super::codec::DecodeErrorKind::ResourceType));
}
}
"id" => {
raw_id = Some(value);
}
"meta" => {
raw_meta = Some(value);
}
"implicitRules" => {
raw_implicit_rules = Some(value);
}
"_implicitRules" => {
raw_implicit_rules_element = Some(value);
}
"language" => {
raw_language = Some(value);
}
"_language" => {
raw_language_element = Some(value);
}
"text" => {
raw_text = Some(value);
}
"contained" => {
raw_contained = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"identifier" => {
raw_identifier = Some(value);
}
"url" => {
raw_url = Some(value);
}
"_url" => {
raw_url_element = Some(value);
}
"version" => {
raw_version = Some(value);
}
"_version" => {
raw_version_element = Some(value);
}
"status" => {
raw_status = Some(value);
}
"_status" => {
raw_status_element = Some(value);
}
"legalState" => {
raw_legal_state = Some(value);
}
"instantiatesCanonical" => {
raw_instantiates_canonical = Some(value);
}
"instantiatesUri" => {
raw_instantiates_uri = Some(value);
}
"_instantiatesUri" => {
raw_instantiates_uri_element = Some(value);
}
"contentDerivative" => {
raw_content_derivative = Some(value);
}
"issued" => {
raw_issued = Some(value);
}
"_issued" => {
raw_issued_element = Some(value);
}
"applies" => {
raw_applies = Some(value);
}
"expirationType" => {
raw_expiration_type = Some(value);
}
"subject" => {
raw_subject = Some(value);
}
"authority" => {
raw_authority = Some(value);
}
"domain" => {
raw_domain = Some(value);
}
"site" => {
raw_site = Some(value);
}
"name" => {
raw_name = Some(value);
}
"_name" => {
raw_name_element = Some(value);
}
"title" => {
raw_title = Some(value);
}
"_title" => {
raw_title_element = Some(value);
}
"subtitle" => {
raw_subtitle = Some(value);
}
"_subtitle" => {
raw_subtitle_element = Some(value);
}
"alias" => {
raw_alias = Some(value);
}
"_alias" => {
raw_alias_element = Some(value);
}
"author" => {
raw_author = Some(value);
}
"scope" => {
raw_scope = Some(value);
}
"topicCodeableConcept" => {
raw_topic.value("CodeableConcept", value, path)?;
}
"_topicCodeableConcept" => {
raw_topic.element("CodeableConcept", value, path)?;
}
"topicReference" => {
raw_topic.value("Reference", value, path)?;
}
"_topicReference" => {
raw_topic.element("Reference", value, path)?;
}
"type" => {
raw_type = Some(value);
}
"subType" => {
raw_sub_type = Some(value);
}
"contentDefinition" => {
raw_content_definition = Some(value);
}
"term" => {
raw_term = Some(value);
}
"supportingInfo" => {
raw_supporting_info = Some(value);
}
"relevantHistory" => {
raw_relevant_history = Some(value);
}
"signer" => {
raw_signer = Some(value);
}
"friendly" => {
raw_friendly = Some(value);
}
"legal" => {
raw_legal = Some(value);
}
"rule" => {
raw_rule = Some(value);
}
"legallyBindingAttachment" => {
raw_legally_binding.value("Attachment", value, path)?;
}
"_legallyBindingAttachment" => {
raw_legally_binding.element("Attachment", value, path)?;
}
"legallyBindingReference" => {
raw_legally_binding.value("Reference", value, path)?;
}
"_legallyBindingReference" => {
raw_legally_binding.element("Reference", value, path)?;
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let field_meta = raw_meta
.map(|value| {
path.with("meta", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_implicit_rules = match (raw_implicit_rules, raw_implicit_rules_element) {
(None, None) => None,
(value, element) => Some(path.with("implicitRules", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_language = match (raw_language, raw_language_element) {
(None, None) => None,
(value, element) => Some(path.with("language", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_text = raw_text
.map(|value| {
path.with("text", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_contained = Vec::new();
if let Some(raw) = raw_contained {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_contained.push(path.with_index("contained", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let mut field_identifier = Vec::new();
if let Some(raw) = raw_identifier {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_identifier.push(path.with_index("identifier", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_url = match (raw_url, raw_url_element) {
(None, None) => None,
(value, element) => Some(path.with("url", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_version = match (raw_version, raw_version_element) {
(None, None) => None,
(value, element) => Some(path.with("version", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_status = match (raw_status, raw_status_element) {
(None, None) => None,
(value, element) => Some(path.with("status", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_legal_state = raw_legal_state
.map(|value| {
path.with("legalState", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_instantiates_canonical = raw_instantiates_canonical
.map(|value| {
path.with("instantiatesCanonical", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_instantiates_uri = match (raw_instantiates_uri, raw_instantiates_uri_element) {
(None, None) => None,
(value, element) => Some(path.with("instantiatesUri", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_content_derivative = raw_content_derivative
.map(|value| {
path.with("contentDerivative", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_issued = match (raw_issued, raw_issued_element) {
(None, None) => None,
(value, element) => Some(path.with("issued", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_applies = raw_applies
.map(|value| {
path.with("applies", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_expiration_type = raw_expiration_type
.map(|value| {
path.with("expirationType", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_subject = Vec::new();
if let Some(raw) = raw_subject {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_subject.push(path.with_index("subject", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_authority = Vec::new();
if let Some(raw) = raw_authority {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_authority.push(path.with_index("authority", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_domain = Vec::new();
if let Some(raw) = raw_domain {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_domain.push(path.with_index("domain", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_site = Vec::new();
if let Some(raw) = raw_site {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_site.push(path.with_index("site", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_name = match (raw_name, raw_name_element) {
(None, None) => None,
(value, element) => Some(path.with("name", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_title = match (raw_title, raw_title_element) {
(None, None) => None,
(value, element) => Some(path.with("title", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_subtitle = match (raw_subtitle, raw_subtitle_element) {
(None, None) => None,
(value, element) => Some(path.with("subtitle", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let mut field_alias = Vec::new();
for (index, (value, element)) in
super::super::codec::pair_arrays(raw_alias, raw_alias_element, path)?
.into_iter()
.enumerate()
{
field_alias.push(path.with_index("alias", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let field_author = raw_author
.map(|value| {
path.with("author", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_scope = raw_scope
.map(|value| {
path.with("scope", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_topic = match raw_topic.suffix {
None => None,
Some(suffix) => Some(path.with("topic", |path| {
ContractTopic::from_json_parts(suffix, raw_topic.value, raw_topic.element, path)
})?),
};
let field_type = raw_type
.map(|value| {
path.with("type", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_sub_type = Vec::new();
if let Some(raw) = raw_sub_type {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_sub_type.push(path.with_index("subType", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_content_definition = raw_content_definition
.map(|value| {
path.with("contentDefinition", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_term = Vec::new();
if let Some(raw) = raw_term {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_term.push(path.with_index("term", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_supporting_info = Vec::new();
if let Some(raw) = raw_supporting_info {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_supporting_info.push(path.with_index("supportingInfo", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_relevant_history = Vec::new();
if let Some(raw) = raw_relevant_history {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_relevant_history.push(path.with_index("relevantHistory", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_signer = Vec::new();
if let Some(raw) = raw_signer {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_signer.push(path.with_index("signer", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_friendly = Vec::new();
if let Some(raw) = raw_friendly {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_friendly.push(path.with_index("friendly", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_legal = Vec::new();
if let Some(raw) = raw_legal {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_legal.push(path.with_index("legal", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_rule = Vec::new();
if let Some(raw) = raw_rule {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_rule.push(path.with_index("rule", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_legally_binding = match raw_legally_binding.suffix {
None => None,
Some(suffix) => Some(path.with("legallyBinding", |path| {
ContractLegallyBinding::from_json_parts(
suffix,
raw_legally_binding.value,
raw_legally_binding.element,
path,
)
})?),
};
Ok(Self {
id: field_id,
meta: field_meta,
implicit_rules: field_implicit_rules,
language: field_language,
text: field_text,
contained: field_contained,
extension: field_extension,
modifier_extension: field_modifier_extension,
identifier: field_identifier,
url: field_url,
version: field_version,
status: field_status,
legal_state: field_legal_state,
instantiates_canonical: field_instantiates_canonical,
instantiates_uri: field_instantiates_uri,
content_derivative: field_content_derivative,
issued: field_issued,
applies: field_applies,
expiration_type: field_expiration_type,
subject: field_subject,
authority: field_authority,
domain: field_domain,
site: field_site,
name: field_name,
title: field_title,
subtitle: field_subtitle,
alias: field_alias,
author: field_author,
scope: field_scope,
topic: field_topic,
r#type: field_type,
sub_type: field_sub_type,
content_definition: field_content_definition,
term: field_term,
supporting_info: field_supporting_info,
relevant_history: field_relevant_history,
signer: field_signer,
friendly: field_friendly,
legal: field_legal,
rule: field_rule,
legally_binding: field_legally_binding,
})
}
}
impl serde::Serialize for Contract {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
super::super::codec::element_list_entry(&mut map, "_alias", &self.alias)?;
if let Some(item) = &self.implicit_rules {
super::super::codec::element_entry(&mut map, "_implicitRules", item)?;
}
if let Some(item) = &self.instantiates_uri {
super::super::codec::element_entry(&mut map, "_instantiatesUri", item)?;
}
if let Some(item) = &self.issued {
super::super::codec::element_entry(&mut map, "_issued", item)?;
}
if let Some(item) = &self.language {
super::super::codec::element_entry(&mut map, "_language", item)?;
}
if let Some(item) = &self.name {
super::super::codec::element_entry(&mut map, "_name", item)?;
}
if let Some(item) = &self.status {
super::super::codec::element_entry(&mut map, "_status", item)?;
}
if let Some(item) = &self.subtitle {
super::super::codec::element_entry(&mut map, "_subtitle", item)?;
}
if let Some(item) = &self.title {
super::super::codec::element_entry(&mut map, "_title", item)?;
}
if let Some(item) = &self.url {
super::super::codec::element_entry(&mut map, "_url", item)?;
}
if let Some(item) = &self.version {
super::super::codec::element_entry(&mut map, "_version", item)?;
}
super::super::codec::value_list_entry(&mut map, "alias", &self.alias)?;
if let Some(item) = &self.applies {
serde::ser::SerializeMap::serialize_entry(&mut map, "applies", item)?;
}
if let Some(item) = &self.author {
serde::ser::SerializeMap::serialize_entry(&mut map, "author", item)?;
}
if !self.authority.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "authority", &self.authority)?;
}
if !self.contained.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "contained", &self.contained)?;
}
if let Some(item) = &self.content_definition {
serde::ser::SerializeMap::serialize_entry(&mut map, "contentDefinition", item)?;
}
if let Some(item) = &self.content_derivative {
serde::ser::SerializeMap::serialize_entry(&mut map, "contentDerivative", item)?;
}
if !self.domain.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "domain", &self.domain)?;
}
if let Some(item) = &self.expiration_type {
serde::ser::SerializeMap::serialize_entry(&mut map, "expirationType", item)?;
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if !self.friendly.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "friendly", &self.friendly)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.identifier.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "identifier", &self.identifier)?;
}
if let Some(item) = &self.implicit_rules {
super::super::codec::value_entry(&mut map, "implicitRules", item)?;
}
if let Some(item) = &self.instantiates_canonical {
serde::ser::SerializeMap::serialize_entry(&mut map, "instantiatesCanonical", item)?;
}
if let Some(item) = &self.instantiates_uri {
super::super::codec::value_entry(&mut map, "instantiatesUri", item)?;
}
if let Some(item) = &self.issued {
super::super::codec::value_entry(&mut map, "issued", item)?;
}
if let Some(item) = &self.language {
super::super::codec::value_entry(&mut map, "language", item)?;
}
if !self.legal.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "legal", &self.legal)?;
}
if let Some(item) = &self.legal_state {
serde::ser::SerializeMap::serialize_entry(&mut map, "legalState", item)?;
}
match &self.legally_binding {
Some(ContractLegallyBinding::Attachment(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"legallyBindingAttachment",
inner.as_ref(),
)?;
}
Some(ContractLegallyBinding::Reference(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"legallyBindingReference",
inner.as_ref(),
)?;
}
None => {}
}
if let Some(item) = &self.meta {
serde::ser::SerializeMap::serialize_entry(&mut map, "meta", item)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
if let Some(item) = &self.name {
super::super::codec::value_entry(&mut map, "name", item)?;
}
if !self.relevant_history.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"relevantHistory",
&self.relevant_history,
)?;
}
serde::ser::SerializeMap::serialize_entry(&mut map, "resourceType", "Contract")?;
if !self.rule.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "rule", &self.rule)?;
}
if let Some(item) = &self.scope {
serde::ser::SerializeMap::serialize_entry(&mut map, "scope", item)?;
}
if !self.signer.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "signer", &self.signer)?;
}
if !self.site.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "site", &self.site)?;
}
if let Some(item) = &self.status {
super::super::codec::value_entry(&mut map, "status", item)?;
}
if !self.sub_type.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "subType", &self.sub_type)?;
}
if !self.subject.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "subject", &self.subject)?;
}
if let Some(item) = &self.subtitle {
super::super::codec::value_entry(&mut map, "subtitle", item)?;
}
if !self.supporting_info.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"supportingInfo",
&self.supporting_info,
)?;
}
if !self.term.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "term", &self.term)?;
}
if let Some(item) = &self.text {
serde::ser::SerializeMap::serialize_entry(&mut map, "text", item)?;
}
if let Some(item) = &self.title {
super::super::codec::value_entry(&mut map, "title", item)?;
}
match &self.topic {
Some(ContractTopic::CodeableConcept(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"topicCodeableConcept",
inner.as_ref(),
)?;
}
Some(ContractTopic::Reference(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"topicReference",
inner.as_ref(),
)?;
}
None => {}
}
if let Some(item) = &self.r#type {
serde::ser::SerializeMap::serialize_entry(&mut map, "type", item)?;
}
if let Some(item) = &self.url {
super::super::codec::value_entry(&mut map, "url", item)?;
}
if let Some(item) = &self.version {
super::super::codec::value_entry(&mut map, "version", item)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for Contract {
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("Contract");
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 ContractContentDefinition {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub r#type: super::codeable_concept::CodeableConcept,
pub sub_type: Option<super::codeable_concept::CodeableConcept>,
pub publisher: Option<super::reference::Reference>,
pub publication_date: Option<super::primitives::DateTime>,
pub publication_status: super::primitives::Code,
pub copyright: Option<super::primitives::Markdown>,
}
impl super::super::codec::Json for ContractContentDefinition {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
object.insert(
std::string::String::from("type"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.r#type)?),
);
if let Some(item) = &self.sub_type {
object.insert(
std::string::String::from("subType"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.publisher {
object.insert(
std::string::String::from("publisher"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.publication_date {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("publicationDate"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_publicationDate"), e);
}
}
if let Some(v) = super::super::codec::Primitive::value_json(&self.publication_status)? {
object.insert(std::string::String::from("publicationStatus"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(&self.publication_status)? {
object.insert(std::string::String::from("_publicationStatus"), e);
}
if let Some(item) = &self.copyright {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("copyright"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_copyright"), e);
}
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_type: Option<&super::super::codec::Value> = None;
let mut raw_sub_type: Option<&super::super::codec::Value> = None;
let mut raw_publisher: Option<&super::super::codec::Value> = None;
let mut raw_publication_date: Option<&super::super::codec::Value> = None;
let mut raw_publication_date_element: Option<&super::super::codec::Value> = None;
let mut raw_publication_status: Option<&super::super::codec::Value> = None;
let mut raw_publication_status_element: Option<&super::super::codec::Value> = None;
let mut raw_copyright: Option<&super::super::codec::Value> = None;
let mut raw_copyright_element: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"type" => {
raw_type = Some(value);
}
"subType" => {
raw_sub_type = Some(value);
}
"publisher" => {
raw_publisher = Some(value);
}
"publicationDate" => {
raw_publication_date = Some(value);
}
"_publicationDate" => {
raw_publication_date_element = Some(value);
}
"publicationStatus" => {
raw_publication_status = Some(value);
}
"_publicationStatus" => {
raw_publication_status_element = Some(value);
}
"copyright" => {
raw_copyright = Some(value);
}
"_copyright" => {
raw_copyright_element = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_type = path.with("type", |path| {
let value = raw_type
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})?;
let field_sub_type = raw_sub_type
.map(|value| {
path.with("subType", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_publisher = raw_publisher
.map(|value| {
path.with("publisher", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_publication_date = match (raw_publication_date, raw_publication_date_element) {
(None, None) => None,
(value, element) => Some(path.with("publicationDate", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_publication_status = path.with("publicationStatus", |path| {
super::super::codec::Primitive::from_json_parts(
raw_publication_status,
raw_publication_status_element,
path,
)
})?;
let field_copyright = match (raw_copyright, raw_copyright_element) {
(None, None) => None,
(value, element) => Some(path.with("copyright", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
r#type: field_type,
sub_type: field_sub_type,
publisher: field_publisher,
publication_date: field_publication_date,
publication_status: field_publication_status,
copyright: field_copyright,
})
}
}
impl serde::Serialize for ContractContentDefinition {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
if let Some(item) = &self.copyright {
super::super::codec::element_entry(&mut map, "_copyright", item)?;
}
if let Some(item) = &self.publication_date {
super::super::codec::element_entry(&mut map, "_publicationDate", item)?;
}
super::super::codec::element_entry(
&mut map,
"_publicationStatus",
&self.publication_status,
)?;
if let Some(item) = &self.copyright {
super::super::codec::value_entry(&mut map, "copyright", item)?;
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
if let Some(item) = &self.publication_date {
super::super::codec::value_entry(&mut map, "publicationDate", item)?;
}
super::super::codec::value_entry(&mut map, "publicationStatus", &self.publication_status)?;
if let Some(item) = &self.publisher {
serde::ser::SerializeMap::serialize_entry(&mut map, "publisher", item)?;
}
if let Some(item) = &self.sub_type {
serde::ser::SerializeMap::serialize_entry(&mut map, "subType", item)?;
}
serde::ser::SerializeMap::serialize_entry(&mut map, "type", &self.r#type)?;
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractContentDefinition {
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("ContractContentDefinition");
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, PartialEq, Eq)]
pub struct ContractFriendly {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub content: ContractFriendlyContent,
}
impl super::super::codec::Json for ContractFriendly {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
let (suffix, value, element) = self.content.to_json_parts()?;
if let Some(value) = value {
object.insert(format!("content{suffix}"), value);
}
if let Some(element) = element {
object.insert(format!("_content{suffix}"), element);
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_content = super::super::codec::ChoiceSlot::default();
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"contentAttachment" => {
raw_content.value("Attachment", value, path)?;
}
"_contentAttachment" => {
raw_content.element("Attachment", value, path)?;
}
"contentReference" => {
raw_content.value("Reference", value, path)?;
}
"_contentReference" => {
raw_content.element("Reference", value, path)?;
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_content = path.with("content", |path| {
let suffix = raw_content
.suffix
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
ContractFriendlyContent::from_json_parts(
suffix,
raw_content.value,
raw_content.element,
path,
)
})?;
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
content: field_content,
})
}
}
impl serde::Serialize for ContractFriendly {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
match &self.content {
ContractFriendlyContent::Attachment(inner) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"contentAttachment",
inner.as_ref(),
)?;
}
ContractFriendlyContent::Reference(inner) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"contentReference",
inner.as_ref(),
)?;
}
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractFriendly {
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("ContractFriendly");
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, PartialEq, Eq)]
pub enum ContractFriendlyContent {
Attachment(Box<super::attachment::Attachment>),
Reference(Box<super::reference::Reference>),
}
impl ContractFriendlyContent {
pub fn to_json_parts(
&self,
) -> Result<
(
&'static str,
Option<super::super::codec::Value>,
Option<super::super::codec::Value>,
),
super::super::codec::EncodeError,
> {
match self {
Self::Attachment(inner) => Ok((
"Attachment",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Reference(inner) => Ok((
"Reference",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
}
}
pub fn from_json_parts(
suffix: &str,
value: Option<&super::super::codec::Value>,
element: Option<&super::super::codec::Value>,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match suffix {
"Attachment" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Attachment(Box::new(inner)))
}
"Reference" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Reference(Box::new(inner)))
}
_ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractLegal {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub content: ContractLegalContent,
}
impl super::super::codec::Json for ContractLegal {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
let (suffix, value, element) = self.content.to_json_parts()?;
if let Some(value) = value {
object.insert(format!("content{suffix}"), value);
}
if let Some(element) = element {
object.insert(format!("_content{suffix}"), element);
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_content = super::super::codec::ChoiceSlot::default();
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"contentAttachment" => {
raw_content.value("Attachment", value, path)?;
}
"_contentAttachment" => {
raw_content.element("Attachment", value, path)?;
}
"contentReference" => {
raw_content.value("Reference", value, path)?;
}
"_contentReference" => {
raw_content.element("Reference", value, path)?;
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_content = path.with("content", |path| {
let suffix = raw_content
.suffix
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
ContractLegalContent::from_json_parts(
suffix,
raw_content.value,
raw_content.element,
path,
)
})?;
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
content: field_content,
})
}
}
impl serde::Serialize for ContractLegal {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
match &self.content {
ContractLegalContent::Attachment(inner) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"contentAttachment",
inner.as_ref(),
)?;
}
ContractLegalContent::Reference(inner) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"contentReference",
inner.as_ref(),
)?;
}
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractLegal {
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("ContractLegal");
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, PartialEq, Eq)]
pub enum ContractLegalContent {
Attachment(Box<super::attachment::Attachment>),
Reference(Box<super::reference::Reference>),
}
impl ContractLegalContent {
pub fn to_json_parts(
&self,
) -> Result<
(
&'static str,
Option<super::super::codec::Value>,
Option<super::super::codec::Value>,
),
super::super::codec::EncodeError,
> {
match self {
Self::Attachment(inner) => Ok((
"Attachment",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Reference(inner) => Ok((
"Reference",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
}
}
pub fn from_json_parts(
suffix: &str,
value: Option<&super::super::codec::Value>,
element: Option<&super::super::codec::Value>,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match suffix {
"Attachment" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Attachment(Box::new(inner)))
}
"Reference" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Reference(Box::new(inner)))
}
_ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ContractLegallyBinding {
Attachment(Box<super::attachment::Attachment>),
Reference(Box<super::reference::Reference>),
}
impl ContractLegallyBinding {
pub fn to_json_parts(
&self,
) -> Result<
(
&'static str,
Option<super::super::codec::Value>,
Option<super::super::codec::Value>,
),
super::super::codec::EncodeError,
> {
match self {
Self::Attachment(inner) => Ok((
"Attachment",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Reference(inner) => Ok((
"Reference",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
}
}
pub fn from_json_parts(
suffix: &str,
value: Option<&super::super::codec::Value>,
element: Option<&super::super::codec::Value>,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match suffix {
"Attachment" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Attachment(Box::new(inner)))
}
"Reference" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Reference(Box::new(inner)))
}
_ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractRule {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub content: ContractRuleContent,
}
impl super::super::codec::Json for ContractRule {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
let (suffix, value, element) = self.content.to_json_parts()?;
if let Some(value) = value {
object.insert(format!("content{suffix}"), value);
}
if let Some(element) = element {
object.insert(format!("_content{suffix}"), element);
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_content = super::super::codec::ChoiceSlot::default();
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"contentAttachment" => {
raw_content.value("Attachment", value, path)?;
}
"_contentAttachment" => {
raw_content.element("Attachment", value, path)?;
}
"contentReference" => {
raw_content.value("Reference", value, path)?;
}
"_contentReference" => {
raw_content.element("Reference", value, path)?;
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_content = path.with("content", |path| {
let suffix = raw_content
.suffix
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
ContractRuleContent::from_json_parts(
suffix,
raw_content.value,
raw_content.element,
path,
)
})?;
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
content: field_content,
})
}
}
impl serde::Serialize for ContractRule {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
match &self.content {
ContractRuleContent::Attachment(inner) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"contentAttachment",
inner.as_ref(),
)?;
}
ContractRuleContent::Reference(inner) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"contentReference",
inner.as_ref(),
)?;
}
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractRule {
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("ContractRule");
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, PartialEq, Eq)]
pub enum ContractRuleContent {
Attachment(Box<super::attachment::Attachment>),
Reference(Box<super::reference::Reference>),
}
impl ContractRuleContent {
pub fn to_json_parts(
&self,
) -> Result<
(
&'static str,
Option<super::super::codec::Value>,
Option<super::super::codec::Value>,
),
super::super::codec::EncodeError,
> {
match self {
Self::Attachment(inner) => Ok((
"Attachment",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Reference(inner) => Ok((
"Reference",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
}
}
pub fn from_json_parts(
suffix: &str,
value: Option<&super::super::codec::Value>,
element: Option<&super::super::codec::Value>,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match suffix {
"Attachment" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Attachment(Box::new(inner)))
}
"Reference" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Reference(Box::new(inner)))
}
_ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ContractSigner {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub r#type: super::coding::Coding,
pub party: super::reference::Reference,
pub signature: Vec<super::signature::Signature>,
}
impl super::super::codec::Json for ContractSigner {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
object.insert(
std::string::String::from("type"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.r#type)?),
);
object.insert(
std::string::String::from("party"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.party)?),
);
if !self.signature.is_empty() {
let mut items = Vec::with_capacity(self.signature.len());
for item in &self.signature {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("signature"),
super::super::codec::Value::Array(items),
);
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_type: Option<&super::super::codec::Value> = None;
let mut raw_party: Option<&super::super::codec::Value> = None;
let mut raw_signature: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"type" => {
raw_type = Some(value);
}
"party" => {
raw_party = Some(value);
}
"signature" => {
raw_signature = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_type = path.with("type", |path| {
let value = raw_type
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})?;
let field_party = path.with("party", |path| {
let value = raw_party
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})?;
let mut field_signature = Vec::new();
if let Some(raw) = raw_signature {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_signature.push(path.with_index("signature", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
r#type: field_type,
party: field_party,
signature: field_signature,
})
}
}
impl serde::Serialize for ContractSigner {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
serde::ser::SerializeMap::serialize_entry(&mut map, "party", &self.party)?;
if !self.signature.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "signature", &self.signature)?;
}
serde::ser::SerializeMap::serialize_entry(&mut map, "type", &self.r#type)?;
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractSigner {
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("ContractSigner");
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 ContractTerm {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub identifier: Option<super::identifier::Identifier>,
pub issued: Option<super::primitives::DateTime>,
pub applies: Option<super::period::Period>,
pub topic: Option<ContractTermTopic>,
pub r#type: Option<super::codeable_concept::CodeableConcept>,
pub sub_type: Option<super::codeable_concept::CodeableConcept>,
pub text: Option<super::primitives::Markdown>,
pub security_label: Vec<ContractTermSecurityLabel>,
pub offer: ContractTermOffer,
pub asset: Vec<ContractTermAsset>,
pub action: Vec<ContractTermAction>,
pub group: Vec<ContractTerm>,
}
impl super::super::codec::Json for ContractTerm {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.identifier {
object.insert(
std::string::String::from("identifier"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.issued {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("issued"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_issued"), e);
}
}
if let Some(item) = &self.applies {
object.insert(
std::string::String::from("applies"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.topic {
let (suffix, value, element) = item.to_json_parts()?;
if let Some(value) = value {
object.insert(format!("topic{suffix}"), value);
}
if let Some(element) = element {
object.insert(format!("_topic{suffix}"), element);
}
}
if let Some(item) = &self.r#type {
object.insert(
std::string::String::from("type"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.sub_type {
object.insert(
std::string::String::from("subType"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.text {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("text"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_text"), e);
}
}
if !self.security_label.is_empty() {
let mut items = Vec::with_capacity(self.security_label.len());
for item in &self.security_label {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("securityLabel"),
super::super::codec::Value::Array(items),
);
}
object.insert(
std::string::String::from("offer"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.offer)?),
);
if !self.asset.is_empty() {
let mut items = Vec::with_capacity(self.asset.len());
for item in &self.asset {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("asset"),
super::super::codec::Value::Array(items),
);
}
if !self.action.is_empty() {
let mut items = Vec::with_capacity(self.action.len());
for item in &self.action {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("action"),
super::super::codec::Value::Array(items),
);
}
if !self.group.is_empty() {
let mut items = Vec::with_capacity(self.group.len());
for item in &self.group {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("group"),
super::super::codec::Value::Array(items),
);
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_identifier: Option<&super::super::codec::Value> = None;
let mut raw_issued: Option<&super::super::codec::Value> = None;
let mut raw_issued_element: Option<&super::super::codec::Value> = None;
let mut raw_applies: Option<&super::super::codec::Value> = None;
let mut raw_topic = super::super::codec::ChoiceSlot::default();
let mut raw_type: Option<&super::super::codec::Value> = None;
let mut raw_sub_type: Option<&super::super::codec::Value> = None;
let mut raw_text: Option<&super::super::codec::Value> = None;
let mut raw_text_element: Option<&super::super::codec::Value> = None;
let mut raw_security_label: Option<&super::super::codec::Value> = None;
let mut raw_offer: Option<&super::super::codec::Value> = None;
let mut raw_asset: Option<&super::super::codec::Value> = None;
let mut raw_action: Option<&super::super::codec::Value> = None;
let mut raw_group: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"identifier" => {
raw_identifier = Some(value);
}
"issued" => {
raw_issued = Some(value);
}
"_issued" => {
raw_issued_element = Some(value);
}
"applies" => {
raw_applies = Some(value);
}
"topicCodeableConcept" => {
raw_topic.value("CodeableConcept", value, path)?;
}
"_topicCodeableConcept" => {
raw_topic.element("CodeableConcept", value, path)?;
}
"topicReference" => {
raw_topic.value("Reference", value, path)?;
}
"_topicReference" => {
raw_topic.element("Reference", value, path)?;
}
"type" => {
raw_type = Some(value);
}
"subType" => {
raw_sub_type = Some(value);
}
"text" => {
raw_text = Some(value);
}
"_text" => {
raw_text_element = Some(value);
}
"securityLabel" => {
raw_security_label = Some(value);
}
"offer" => {
raw_offer = Some(value);
}
"asset" => {
raw_asset = Some(value);
}
"action" => {
raw_action = Some(value);
}
"group" => {
raw_group = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_identifier = raw_identifier
.map(|value| {
path.with("identifier", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_issued = match (raw_issued, raw_issued_element) {
(None, None) => None,
(value, element) => Some(path.with("issued", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_applies = raw_applies
.map(|value| {
path.with("applies", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_topic = match raw_topic.suffix {
None => None,
Some(suffix) => Some(path.with("topic", |path| {
ContractTermTopic::from_json_parts(suffix, raw_topic.value, raw_topic.element, path)
})?),
};
let field_type = raw_type
.map(|value| {
path.with("type", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_sub_type = raw_sub_type
.map(|value| {
path.with("subType", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_text = match (raw_text, raw_text_element) {
(None, None) => None,
(value, element) => Some(path.with("text", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let mut field_security_label = Vec::new();
if let Some(raw) = raw_security_label {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_security_label.push(path.with_index("securityLabel", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_offer = path.with("offer", |path| {
let value = raw_offer
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})?;
let mut field_asset = Vec::new();
if let Some(raw) = raw_asset {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_asset.push(path.with_index("asset", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_action = Vec::new();
if let Some(raw) = raw_action {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_action.push(path.with_index("action", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_group = Vec::new();
if let Some(raw) = raw_group {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_group.push(path.with_index("group", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
identifier: field_identifier,
issued: field_issued,
applies: field_applies,
topic: field_topic,
r#type: field_type,
sub_type: field_sub_type,
text: field_text,
security_label: field_security_label,
offer: field_offer,
asset: field_asset,
action: field_action,
group: field_group,
})
}
}
impl serde::Serialize for ContractTerm {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
if let Some(item) = &self.issued {
super::super::codec::element_entry(&mut map, "_issued", item)?;
}
if let Some(item) = &self.text {
super::super::codec::element_entry(&mut map, "_text", item)?;
}
if !self.action.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "action", &self.action)?;
}
if let Some(item) = &self.applies {
serde::ser::SerializeMap::serialize_entry(&mut map, "applies", item)?;
}
if !self.asset.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "asset", &self.asset)?;
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if !self.group.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "group", &self.group)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if let Some(item) = &self.identifier {
serde::ser::SerializeMap::serialize_entry(&mut map, "identifier", item)?;
}
if let Some(item) = &self.issued {
super::super::codec::value_entry(&mut map, "issued", item)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
serde::ser::SerializeMap::serialize_entry(&mut map, "offer", &self.offer)?;
if !self.security_label.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"securityLabel",
&self.security_label,
)?;
}
if let Some(item) = &self.sub_type {
serde::ser::SerializeMap::serialize_entry(&mut map, "subType", item)?;
}
if let Some(item) = &self.text {
super::super::codec::value_entry(&mut map, "text", item)?;
}
match &self.topic {
Some(ContractTermTopic::CodeableConcept(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"topicCodeableConcept",
inner.as_ref(),
)?;
}
Some(ContractTermTopic::Reference(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"topicReference",
inner.as_ref(),
)?;
}
None => {}
}
if let Some(item) = &self.r#type {
serde::ser::SerializeMap::serialize_entry(&mut map, "type", item)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTerm {
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("ContractTerm");
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 ContractTermAction {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub do_not_perform: Option<super::primitives::Boolean>,
pub r#type: super::codeable_concept::CodeableConcept,
pub subject: Vec<ContractTermActionSubject>,
pub intent: super::codeable_concept::CodeableConcept,
pub link_id: Vec<super::primitives::String>,
pub status: super::codeable_concept::CodeableConcept,
pub context: Option<super::reference::Reference>,
pub context_link_id: Vec<super::primitives::String>,
pub occurrence: Option<ContractTermActionOccurrence>,
pub requester: Vec<super::reference::Reference>,
pub requester_link_id: Vec<super::primitives::String>,
pub performer_type: Vec<super::codeable_concept::CodeableConcept>,
pub performer_role: Option<super::codeable_concept::CodeableConcept>,
pub performer: Option<super::reference::Reference>,
pub performer_link_id: Vec<super::primitives::String>,
pub reason: Vec<super::codeable_reference::CodeableReference>,
pub reason_link_id: Vec<super::primitives::String>,
pub note: Vec<super::annotation::Annotation>,
pub security_label_number: Vec<super::primitives::UnsignedInt>,
}
impl super::super::codec::Json for ContractTermAction {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.do_not_perform {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("doNotPerform"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_doNotPerform"), e);
}
}
object.insert(
std::string::String::from("type"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.r#type)?),
);
if !self.subject.is_empty() {
let mut items = Vec::with_capacity(self.subject.len());
for item in &self.subject {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("subject"),
super::super::codec::Value::Array(items),
);
}
object.insert(
std::string::String::from("intent"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.intent)?),
);
if !self.link_id.is_empty() {
let (values, elements) = super::super::codec::primitive_arrays(&self.link_id)?;
object.insert(std::string::String::from("linkId"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_linkId"), elements);
}
}
object.insert(
std::string::String::from("status"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.status)?),
);
if let Some(item) = &self.context {
object.insert(
std::string::String::from("context"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.context_link_id.is_empty() {
let (values, elements) = super::super::codec::primitive_arrays(&self.context_link_id)?;
object.insert(std::string::String::from("contextLinkId"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_contextLinkId"), elements);
}
}
if let Some(item) = &self.occurrence {
let (suffix, value, element) = item.to_json_parts()?;
if let Some(value) = value {
object.insert(format!("occurrence{suffix}"), value);
}
if let Some(element) = element {
object.insert(format!("_occurrence{suffix}"), element);
}
}
if !self.requester.is_empty() {
let mut items = Vec::with_capacity(self.requester.len());
for item in &self.requester {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("requester"),
super::super::codec::Value::Array(items),
);
}
if !self.requester_link_id.is_empty() {
let (values, elements) =
super::super::codec::primitive_arrays(&self.requester_link_id)?;
object.insert(std::string::String::from("requesterLinkId"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_requesterLinkId"), elements);
}
}
if !self.performer_type.is_empty() {
let mut items = Vec::with_capacity(self.performer_type.len());
for item in &self.performer_type {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("performerType"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.performer_role {
object.insert(
std::string::String::from("performerRole"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.performer {
object.insert(
std::string::String::from("performer"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.performer_link_id.is_empty() {
let (values, elements) =
super::super::codec::primitive_arrays(&self.performer_link_id)?;
object.insert(std::string::String::from("performerLinkId"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_performerLinkId"), elements);
}
}
if !self.reason.is_empty() {
let mut items = Vec::with_capacity(self.reason.len());
for item in &self.reason {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("reason"),
super::super::codec::Value::Array(items),
);
}
if !self.reason_link_id.is_empty() {
let (values, elements) = super::super::codec::primitive_arrays(&self.reason_link_id)?;
object.insert(std::string::String::from("reasonLinkId"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_reasonLinkId"), elements);
}
}
if !self.note.is_empty() {
let mut items = Vec::with_capacity(self.note.len());
for item in &self.note {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("note"),
super::super::codec::Value::Array(items),
);
}
if !self.security_label_number.is_empty() {
let (values, elements) =
super::super::codec::primitive_arrays(&self.security_label_number)?;
object.insert(std::string::String::from("securityLabelNumber"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_securityLabelNumber"), elements);
}
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_do_not_perform: Option<&super::super::codec::Value> = None;
let mut raw_do_not_perform_element: Option<&super::super::codec::Value> = None;
let mut raw_type: Option<&super::super::codec::Value> = None;
let mut raw_subject: Option<&super::super::codec::Value> = None;
let mut raw_intent: Option<&super::super::codec::Value> = None;
let mut raw_link_id: Option<&super::super::codec::Value> = None;
let mut raw_link_id_element: Option<&super::super::codec::Value> = None;
let mut raw_status: Option<&super::super::codec::Value> = None;
let mut raw_context: Option<&super::super::codec::Value> = None;
let mut raw_context_link_id: Option<&super::super::codec::Value> = None;
let mut raw_context_link_id_element: Option<&super::super::codec::Value> = None;
let mut raw_occurrence = super::super::codec::ChoiceSlot::default();
let mut raw_requester: Option<&super::super::codec::Value> = None;
let mut raw_requester_link_id: Option<&super::super::codec::Value> = None;
let mut raw_requester_link_id_element: Option<&super::super::codec::Value> = None;
let mut raw_performer_type: Option<&super::super::codec::Value> = None;
let mut raw_performer_role: Option<&super::super::codec::Value> = None;
let mut raw_performer: Option<&super::super::codec::Value> = None;
let mut raw_performer_link_id: Option<&super::super::codec::Value> = None;
let mut raw_performer_link_id_element: Option<&super::super::codec::Value> = None;
let mut raw_reason: Option<&super::super::codec::Value> = None;
let mut raw_reason_link_id: Option<&super::super::codec::Value> = None;
let mut raw_reason_link_id_element: Option<&super::super::codec::Value> = None;
let mut raw_note: Option<&super::super::codec::Value> = None;
let mut raw_security_label_number: Option<&super::super::codec::Value> = None;
let mut raw_security_label_number_element: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"doNotPerform" => {
raw_do_not_perform = Some(value);
}
"_doNotPerform" => {
raw_do_not_perform_element = Some(value);
}
"type" => {
raw_type = Some(value);
}
"subject" => {
raw_subject = Some(value);
}
"intent" => {
raw_intent = Some(value);
}
"linkId" => {
raw_link_id = Some(value);
}
"_linkId" => {
raw_link_id_element = Some(value);
}
"status" => {
raw_status = Some(value);
}
"context" => {
raw_context = Some(value);
}
"contextLinkId" => {
raw_context_link_id = Some(value);
}
"_contextLinkId" => {
raw_context_link_id_element = Some(value);
}
"occurrenceDateTime" => {
raw_occurrence.value("DateTime", value, path)?;
}
"_occurrenceDateTime" => {
raw_occurrence.element("DateTime", value, path)?;
}
"occurrencePeriod" => {
raw_occurrence.value("Period", value, path)?;
}
"_occurrencePeriod" => {
raw_occurrence.element("Period", value, path)?;
}
"occurrenceTiming" => {
raw_occurrence.value("Timing", value, path)?;
}
"_occurrenceTiming" => {
raw_occurrence.element("Timing", value, path)?;
}
"requester" => {
raw_requester = Some(value);
}
"requesterLinkId" => {
raw_requester_link_id = Some(value);
}
"_requesterLinkId" => {
raw_requester_link_id_element = Some(value);
}
"performerType" => {
raw_performer_type = Some(value);
}
"performerRole" => {
raw_performer_role = Some(value);
}
"performer" => {
raw_performer = Some(value);
}
"performerLinkId" => {
raw_performer_link_id = Some(value);
}
"_performerLinkId" => {
raw_performer_link_id_element = Some(value);
}
"reason" => {
raw_reason = Some(value);
}
"reasonLinkId" => {
raw_reason_link_id = Some(value);
}
"_reasonLinkId" => {
raw_reason_link_id_element = Some(value);
}
"note" => {
raw_note = Some(value);
}
"securityLabelNumber" => {
raw_security_label_number = Some(value);
}
"_securityLabelNumber" => {
raw_security_label_number_element = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_do_not_perform = match (raw_do_not_perform, raw_do_not_perform_element) {
(None, None) => None,
(value, element) => Some(path.with("doNotPerform", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_type = path.with("type", |path| {
let value = raw_type
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})?;
let mut field_subject = Vec::new();
if let Some(raw) = raw_subject {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_subject.push(path.with_index("subject", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_intent = path.with("intent", |path| {
let value = raw_intent
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})?;
let mut field_link_id = Vec::new();
for (index, (value, element)) in
super::super::codec::pair_arrays(raw_link_id, raw_link_id_element, path)?
.into_iter()
.enumerate()
{
field_link_id.push(path.with_index("linkId", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let field_status = path.with("status", |path| {
let value = raw_status
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})?;
let field_context = raw_context
.map(|value| {
path.with("context", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_context_link_id = Vec::new();
for (index, (value, element)) in super::super::codec::pair_arrays(
raw_context_link_id,
raw_context_link_id_element,
path,
)?
.into_iter()
.enumerate()
{
field_context_link_id.push(path.with_index("contextLinkId", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let field_occurrence = match raw_occurrence.suffix {
None => None,
Some(suffix) => Some(path.with("occurrence", |path| {
ContractTermActionOccurrence::from_json_parts(
suffix,
raw_occurrence.value,
raw_occurrence.element,
path,
)
})?),
};
let mut field_requester = Vec::new();
if let Some(raw) = raw_requester {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_requester.push(path.with_index("requester", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_requester_link_id = Vec::new();
for (index, (value, element)) in super::super::codec::pair_arrays(
raw_requester_link_id,
raw_requester_link_id_element,
path,
)?
.into_iter()
.enumerate()
{
field_requester_link_id.push(path.with_index("requesterLinkId", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let mut field_performer_type = Vec::new();
if let Some(raw) = raw_performer_type {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_performer_type.push(path.with_index("performerType", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_performer_role = raw_performer_role
.map(|value| {
path.with("performerRole", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_performer = raw_performer
.map(|value| {
path.with("performer", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_performer_link_id = Vec::new();
for (index, (value, element)) in super::super::codec::pair_arrays(
raw_performer_link_id,
raw_performer_link_id_element,
path,
)?
.into_iter()
.enumerate()
{
field_performer_link_id.push(path.with_index("performerLinkId", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let mut field_reason = Vec::new();
if let Some(raw) = raw_reason {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_reason.push(path.with_index("reason", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_reason_link_id = Vec::new();
for (index, (value, element)) in
super::super::codec::pair_arrays(raw_reason_link_id, raw_reason_link_id_element, path)?
.into_iter()
.enumerate()
{
field_reason_link_id.push(path.with_index("reasonLinkId", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let mut field_note = Vec::new();
if let Some(raw) = raw_note {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_note.push(path.with_index("note", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_security_label_number = Vec::new();
for (index, (value, element)) in super::super::codec::pair_arrays(
raw_security_label_number,
raw_security_label_number_element,
path,
)?
.into_iter()
.enumerate()
{
field_security_label_number.push(path.with_index(
"securityLabelNumber",
index,
|path| super::super::codec::Primitive::from_json_parts(value, element, path),
)?);
}
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
do_not_perform: field_do_not_perform,
r#type: field_type,
subject: field_subject,
intent: field_intent,
link_id: field_link_id,
status: field_status,
context: field_context,
context_link_id: field_context_link_id,
occurrence: field_occurrence,
requester: field_requester,
requester_link_id: field_requester_link_id,
performer_type: field_performer_type,
performer_role: field_performer_role,
performer: field_performer,
performer_link_id: field_performer_link_id,
reason: field_reason,
reason_link_id: field_reason_link_id,
note: field_note,
security_label_number: field_security_label_number,
})
}
}
impl serde::Serialize for ContractTermAction {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
super::super::codec::element_list_entry(&mut map, "_contextLinkId", &self.context_link_id)?;
if let Some(item) = &self.do_not_perform {
super::super::codec::element_entry(&mut map, "_doNotPerform", item)?;
}
super::super::codec::element_list_entry(&mut map, "_linkId", &self.link_id)?;
if let Some(ContractTermActionOccurrence::DateTime(inner)) = &self.occurrence {
super::super::codec::element_entry(&mut map, "_occurrenceDateTime", inner)?;
}
super::super::codec::element_list_entry(
&mut map,
"_performerLinkId",
&self.performer_link_id,
)?;
super::super::codec::element_list_entry(&mut map, "_reasonLinkId", &self.reason_link_id)?;
super::super::codec::element_list_entry(
&mut map,
"_requesterLinkId",
&self.requester_link_id,
)?;
super::super::codec::element_list_entry(
&mut map,
"_securityLabelNumber",
&self.security_label_number,
)?;
if let Some(item) = &self.context {
serde::ser::SerializeMap::serialize_entry(&mut map, "context", item)?;
}
super::super::codec::value_list_entry(&mut map, "contextLinkId", &self.context_link_id)?;
if let Some(item) = &self.do_not_perform {
super::super::codec::value_entry(&mut map, "doNotPerform", item)?;
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
serde::ser::SerializeMap::serialize_entry(&mut map, "intent", &self.intent)?;
super::super::codec::value_list_entry(&mut map, "linkId", &self.link_id)?;
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
if !self.note.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "note", &self.note)?;
}
match &self.occurrence {
Some(ContractTermActionOccurrence::DateTime(inner)) => {
super::super::codec::value_entry(&mut map, "occurrenceDateTime", inner)?;
}
Some(ContractTermActionOccurrence::Period(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"occurrencePeriod",
inner.as_ref(),
)?;
}
Some(ContractTermActionOccurrence::Timing(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"occurrenceTiming",
inner.as_ref(),
)?;
}
None => {}
}
if let Some(item) = &self.performer {
serde::ser::SerializeMap::serialize_entry(&mut map, "performer", item)?;
}
super::super::codec::value_list_entry(
&mut map,
"performerLinkId",
&self.performer_link_id,
)?;
if let Some(item) = &self.performer_role {
serde::ser::SerializeMap::serialize_entry(&mut map, "performerRole", item)?;
}
if !self.performer_type.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"performerType",
&self.performer_type,
)?;
}
if !self.reason.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "reason", &self.reason)?;
}
super::super::codec::value_list_entry(&mut map, "reasonLinkId", &self.reason_link_id)?;
if !self.requester.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "requester", &self.requester)?;
}
super::super::codec::value_list_entry(
&mut map,
"requesterLinkId",
&self.requester_link_id,
)?;
super::super::codec::value_list_entry(
&mut map,
"securityLabelNumber",
&self.security_label_number,
)?;
serde::ser::SerializeMap::serialize_entry(&mut map, "status", &self.status)?;
if !self.subject.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "subject", &self.subject)?;
}
serde::ser::SerializeMap::serialize_entry(&mut map, "type", &self.r#type)?;
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTermAction {
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("ContractTermAction");
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, PartialEq, Eq)]
pub enum ContractTermActionOccurrence {
DateTime(super::primitives::DateTime),
Period(Box<super::period::Period>),
Timing(Box<super::timing::Timing>),
}
impl ContractTermActionOccurrence {
pub fn to_json_parts(
&self,
) -> Result<
(
&'static str,
Option<super::super::codec::Value>,
Option<super::super::codec::Value>,
),
super::super::codec::EncodeError,
> {
match self {
Self::DateTime(inner) => Ok((
"DateTime",
super::super::codec::Primitive::value_json(inner)?,
super::super::codec::Primitive::element_json(inner)?,
)),
Self::Period(inner) => Ok((
"Period",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Timing(inner) => Ok((
"Timing",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
}
}
pub fn from_json_parts(
suffix: &str,
value: Option<&super::super::codec::Value>,
element: Option<&super::super::codec::Value>,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match suffix {
"DateTime" => Ok(Self::DateTime(
super::super::codec::Primitive::from_json_parts(value, element, path)?,
)),
"Period" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Period(Box::new(inner)))
}
"Timing" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Timing(Box::new(inner)))
}
_ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ContractTermActionSubject {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub reference: Vec<super::reference::Reference>,
pub role: Option<super::codeable_concept::CodeableConcept>,
}
impl super::super::codec::Json for ContractTermActionSubject {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if !self.reference.is_empty() {
let mut items = Vec::with_capacity(self.reference.len());
for item in &self.reference {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("reference"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.role {
object.insert(
std::string::String::from("role"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_reference: Option<&super::super::codec::Value> = None;
let mut raw_role: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"reference" => {
raw_reference = Some(value);
}
"role" => {
raw_role = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let mut field_reference = Vec::new();
if let Some(raw) = raw_reference {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_reference.push(path.with_index("reference", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_role = raw_role
.map(|value| {
path.with("role", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
reference: field_reference,
role: field_role,
})
}
}
impl serde::Serialize for ContractTermActionSubject {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
if !self.reference.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "reference", &self.reference)?;
}
if let Some(item) = &self.role {
serde::ser::SerializeMap::serialize_entry(&mut map, "role", item)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTermActionSubject {
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("ContractTermActionSubject");
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 ContractTermAsset {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub scope: Option<super::codeable_concept::CodeableConcept>,
pub r#type: Vec<super::codeable_concept::CodeableConcept>,
pub type_reference: Vec<super::reference::Reference>,
pub subtype: Vec<super::codeable_concept::CodeableConcept>,
pub relationship: Option<super::coding::Coding>,
pub context: Vec<ContractTermAssetContext>,
pub condition: Option<super::primitives::String>,
pub period_type: Vec<super::codeable_concept::CodeableConcept>,
pub period: Vec<super::period::Period>,
pub use_period: Vec<super::period::Period>,
pub text: Option<super::primitives::String>,
pub link_id: Vec<super::primitives::String>,
pub answer: Vec<ContractTermOfferAnswer>,
pub security_label_number: Vec<super::primitives::UnsignedInt>,
pub valued_item: Vec<ContractTermAssetValuedItem>,
}
impl super::super::codec::Json for ContractTermAsset {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.scope {
object.insert(
std::string::String::from("scope"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.r#type.is_empty() {
let mut items = Vec::with_capacity(self.r#type.len());
for item in &self.r#type {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("type"),
super::super::codec::Value::Array(items),
);
}
if !self.type_reference.is_empty() {
let mut items = Vec::with_capacity(self.type_reference.len());
for item in &self.type_reference {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("typeReference"),
super::super::codec::Value::Array(items),
);
}
if !self.subtype.is_empty() {
let mut items = Vec::with_capacity(self.subtype.len());
for item in &self.subtype {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("subtype"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.relationship {
object.insert(
std::string::String::from("relationship"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.context.is_empty() {
let mut items = Vec::with_capacity(self.context.len());
for item in &self.context {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("context"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.condition {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("condition"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_condition"), e);
}
}
if !self.period_type.is_empty() {
let mut items = Vec::with_capacity(self.period_type.len());
for item in &self.period_type {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("periodType"),
super::super::codec::Value::Array(items),
);
}
if !self.period.is_empty() {
let mut items = Vec::with_capacity(self.period.len());
for item in &self.period {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("period"),
super::super::codec::Value::Array(items),
);
}
if !self.use_period.is_empty() {
let mut items = Vec::with_capacity(self.use_period.len());
for item in &self.use_period {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("usePeriod"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.text {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("text"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_text"), e);
}
}
if !self.link_id.is_empty() {
let (values, elements) = super::super::codec::primitive_arrays(&self.link_id)?;
object.insert(std::string::String::from("linkId"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_linkId"), elements);
}
}
if !self.answer.is_empty() {
let mut items = Vec::with_capacity(self.answer.len());
for item in &self.answer {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("answer"),
super::super::codec::Value::Array(items),
);
}
if !self.security_label_number.is_empty() {
let (values, elements) =
super::super::codec::primitive_arrays(&self.security_label_number)?;
object.insert(std::string::String::from("securityLabelNumber"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_securityLabelNumber"), elements);
}
}
if !self.valued_item.is_empty() {
let mut items = Vec::with_capacity(self.valued_item.len());
for item in &self.valued_item {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("valuedItem"),
super::super::codec::Value::Array(items),
);
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_scope: Option<&super::super::codec::Value> = None;
let mut raw_type: Option<&super::super::codec::Value> = None;
let mut raw_type_reference: Option<&super::super::codec::Value> = None;
let mut raw_subtype: Option<&super::super::codec::Value> = None;
let mut raw_relationship: Option<&super::super::codec::Value> = None;
let mut raw_context: Option<&super::super::codec::Value> = None;
let mut raw_condition: Option<&super::super::codec::Value> = None;
let mut raw_condition_element: Option<&super::super::codec::Value> = None;
let mut raw_period_type: Option<&super::super::codec::Value> = None;
let mut raw_period: Option<&super::super::codec::Value> = None;
let mut raw_use_period: Option<&super::super::codec::Value> = None;
let mut raw_text: Option<&super::super::codec::Value> = None;
let mut raw_text_element: Option<&super::super::codec::Value> = None;
let mut raw_link_id: Option<&super::super::codec::Value> = None;
let mut raw_link_id_element: Option<&super::super::codec::Value> = None;
let mut raw_answer: Option<&super::super::codec::Value> = None;
let mut raw_security_label_number: Option<&super::super::codec::Value> = None;
let mut raw_security_label_number_element: Option<&super::super::codec::Value> = None;
let mut raw_valued_item: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"scope" => {
raw_scope = Some(value);
}
"type" => {
raw_type = Some(value);
}
"typeReference" => {
raw_type_reference = Some(value);
}
"subtype" => {
raw_subtype = Some(value);
}
"relationship" => {
raw_relationship = Some(value);
}
"context" => {
raw_context = Some(value);
}
"condition" => {
raw_condition = Some(value);
}
"_condition" => {
raw_condition_element = Some(value);
}
"periodType" => {
raw_period_type = Some(value);
}
"period" => {
raw_period = Some(value);
}
"usePeriod" => {
raw_use_period = Some(value);
}
"text" => {
raw_text = Some(value);
}
"_text" => {
raw_text_element = Some(value);
}
"linkId" => {
raw_link_id = Some(value);
}
"_linkId" => {
raw_link_id_element = Some(value);
}
"answer" => {
raw_answer = Some(value);
}
"securityLabelNumber" => {
raw_security_label_number = Some(value);
}
"_securityLabelNumber" => {
raw_security_label_number_element = Some(value);
}
"valuedItem" => {
raw_valued_item = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_scope = raw_scope
.map(|value| {
path.with("scope", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_type = Vec::new();
if let Some(raw) = raw_type {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_type.push(path.with_index("type", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_type_reference = Vec::new();
if let Some(raw) = raw_type_reference {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_type_reference.push(path.with_index("typeReference", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_subtype = Vec::new();
if let Some(raw) = raw_subtype {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_subtype.push(path.with_index("subtype", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_relationship = raw_relationship
.map(|value| {
path.with("relationship", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_context = Vec::new();
if let Some(raw) = raw_context {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_context.push(path.with_index("context", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_condition = match (raw_condition, raw_condition_element) {
(None, None) => None,
(value, element) => Some(path.with("condition", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let mut field_period_type = Vec::new();
if let Some(raw) = raw_period_type {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_period_type.push(path.with_index("periodType", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_period = Vec::new();
if let Some(raw) = raw_period {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_period.push(path.with_index("period", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_use_period = Vec::new();
if let Some(raw) = raw_use_period {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_use_period.push(path.with_index("usePeriod", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_text = match (raw_text, raw_text_element) {
(None, None) => None,
(value, element) => Some(path.with("text", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let mut field_link_id = Vec::new();
for (index, (value, element)) in
super::super::codec::pair_arrays(raw_link_id, raw_link_id_element, path)?
.into_iter()
.enumerate()
{
field_link_id.push(path.with_index("linkId", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let mut field_answer = Vec::new();
if let Some(raw) = raw_answer {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_answer.push(path.with_index("answer", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_security_label_number = Vec::new();
for (index, (value, element)) in super::super::codec::pair_arrays(
raw_security_label_number,
raw_security_label_number_element,
path,
)?
.into_iter()
.enumerate()
{
field_security_label_number.push(path.with_index(
"securityLabelNumber",
index,
|path| super::super::codec::Primitive::from_json_parts(value, element, path),
)?);
}
let mut field_valued_item = Vec::new();
if let Some(raw) = raw_valued_item {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_valued_item.push(path.with_index("valuedItem", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
scope: field_scope,
r#type: field_type,
type_reference: field_type_reference,
subtype: field_subtype,
relationship: field_relationship,
context: field_context,
condition: field_condition,
period_type: field_period_type,
period: field_period,
use_period: field_use_period,
text: field_text,
link_id: field_link_id,
answer: field_answer,
security_label_number: field_security_label_number,
valued_item: field_valued_item,
})
}
}
impl serde::Serialize for ContractTermAsset {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
if let Some(item) = &self.condition {
super::super::codec::element_entry(&mut map, "_condition", item)?;
}
super::super::codec::element_list_entry(&mut map, "_linkId", &self.link_id)?;
super::super::codec::element_list_entry(
&mut map,
"_securityLabelNumber",
&self.security_label_number,
)?;
if let Some(item) = &self.text {
super::super::codec::element_entry(&mut map, "_text", item)?;
}
if !self.answer.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "answer", &self.answer)?;
}
if let Some(item) = &self.condition {
super::super::codec::value_entry(&mut map, "condition", item)?;
}
if !self.context.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "context", &self.context)?;
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
super::super::codec::value_list_entry(&mut map, "linkId", &self.link_id)?;
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
if !self.period.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "period", &self.period)?;
}
if !self.period_type.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "periodType", &self.period_type)?;
}
if let Some(item) = &self.relationship {
serde::ser::SerializeMap::serialize_entry(&mut map, "relationship", item)?;
}
if let Some(item) = &self.scope {
serde::ser::SerializeMap::serialize_entry(&mut map, "scope", item)?;
}
super::super::codec::value_list_entry(
&mut map,
"securityLabelNumber",
&self.security_label_number,
)?;
if !self.subtype.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "subtype", &self.subtype)?;
}
if let Some(item) = &self.text {
super::super::codec::value_entry(&mut map, "text", item)?;
}
if !self.r#type.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "type", &self.r#type)?;
}
if !self.type_reference.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"typeReference",
&self.type_reference,
)?;
}
if !self.use_period.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "usePeriod", &self.use_period)?;
}
if !self.valued_item.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "valuedItem", &self.valued_item)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTermAsset {
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("ContractTermAsset");
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 ContractTermAssetContext {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub reference: Option<super::reference::Reference>,
pub code: Vec<super::codeable_concept::CodeableConcept>,
pub text: Option<super::primitives::String>,
}
impl super::super::codec::Json for ContractTermAssetContext {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.reference {
object.insert(
std::string::String::from("reference"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.code.is_empty() {
let mut items = Vec::with_capacity(self.code.len());
for item in &self.code {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("code"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.text {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("text"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_text"), e);
}
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_reference: Option<&super::super::codec::Value> = None;
let mut raw_code: Option<&super::super::codec::Value> = None;
let mut raw_text: Option<&super::super::codec::Value> = None;
let mut raw_text_element: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"reference" => {
raw_reference = Some(value);
}
"code" => {
raw_code = Some(value);
}
"text" => {
raw_text = Some(value);
}
"_text" => {
raw_text_element = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_reference = raw_reference
.map(|value| {
path.with("reference", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_code = Vec::new();
if let Some(raw) = raw_code {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_code.push(path.with_index("code", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_text = match (raw_text, raw_text_element) {
(None, None) => None,
(value, element) => Some(path.with("text", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
reference: field_reference,
code: field_code,
text: field_text,
})
}
}
impl serde::Serialize for ContractTermAssetContext {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
if let Some(item) = &self.text {
super::super::codec::element_entry(&mut map, "_text", item)?;
}
if !self.code.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "code", &self.code)?;
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
if let Some(item) = &self.reference {
serde::ser::SerializeMap::serialize_entry(&mut map, "reference", item)?;
}
if let Some(item) = &self.text {
super::super::codec::value_entry(&mut map, "text", item)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTermAssetContext {
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("ContractTermAssetContext");
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 ContractTermAssetValuedItem {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub entity: Option<ContractTermAssetValuedItemEntity>,
pub identifier: Option<super::identifier::Identifier>,
pub effective_time: Option<super::primitives::DateTime>,
pub quantity: Option<super::quantity::Quantity>,
pub unit_price: Option<super::money::Money>,
pub factor: Option<super::primitives::Decimal>,
pub points: Option<super::primitives::Decimal>,
pub net: Option<super::money::Money>,
pub payment: Option<super::primitives::String>,
pub payment_date: Option<super::primitives::DateTime>,
pub responsible: Option<super::reference::Reference>,
pub recipient: Option<super::reference::Reference>,
pub link_id: Vec<super::primitives::String>,
pub security_label_number: Vec<super::primitives::UnsignedInt>,
}
impl super::super::codec::Json for ContractTermAssetValuedItem {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.entity {
let (suffix, value, element) = item.to_json_parts()?;
if let Some(value) = value {
object.insert(format!("entity{suffix}"), value);
}
if let Some(element) = element {
object.insert(format!("_entity{suffix}"), element);
}
}
if let Some(item) = &self.identifier {
object.insert(
std::string::String::from("identifier"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.effective_time {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("effectiveTime"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_effectiveTime"), e);
}
}
if let Some(item) = &self.quantity {
object.insert(
std::string::String::from("quantity"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.unit_price {
object.insert(
std::string::String::from("unitPrice"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.factor {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("factor"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_factor"), e);
}
}
if let Some(item) = &self.points {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("points"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_points"), e);
}
}
if let Some(item) = &self.net {
object.insert(
std::string::String::from("net"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.payment {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("payment"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_payment"), e);
}
}
if let Some(item) = &self.payment_date {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("paymentDate"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_paymentDate"), e);
}
}
if let Some(item) = &self.responsible {
object.insert(
std::string::String::from("responsible"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.recipient {
object.insert(
std::string::String::from("recipient"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.link_id.is_empty() {
let (values, elements) = super::super::codec::primitive_arrays(&self.link_id)?;
object.insert(std::string::String::from("linkId"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_linkId"), elements);
}
}
if !self.security_label_number.is_empty() {
let (values, elements) =
super::super::codec::primitive_arrays(&self.security_label_number)?;
object.insert(std::string::String::from("securityLabelNumber"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_securityLabelNumber"), elements);
}
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_entity = super::super::codec::ChoiceSlot::default();
let mut raw_identifier: Option<&super::super::codec::Value> = None;
let mut raw_effective_time: Option<&super::super::codec::Value> = None;
let mut raw_effective_time_element: Option<&super::super::codec::Value> = None;
let mut raw_quantity: Option<&super::super::codec::Value> = None;
let mut raw_unit_price: Option<&super::super::codec::Value> = None;
let mut raw_factor: Option<&super::super::codec::Value> = None;
let mut raw_factor_element: Option<&super::super::codec::Value> = None;
let mut raw_points: Option<&super::super::codec::Value> = None;
let mut raw_points_element: Option<&super::super::codec::Value> = None;
let mut raw_net: Option<&super::super::codec::Value> = None;
let mut raw_payment: Option<&super::super::codec::Value> = None;
let mut raw_payment_element: Option<&super::super::codec::Value> = None;
let mut raw_payment_date: Option<&super::super::codec::Value> = None;
let mut raw_payment_date_element: Option<&super::super::codec::Value> = None;
let mut raw_responsible: Option<&super::super::codec::Value> = None;
let mut raw_recipient: Option<&super::super::codec::Value> = None;
let mut raw_link_id: Option<&super::super::codec::Value> = None;
let mut raw_link_id_element: Option<&super::super::codec::Value> = None;
let mut raw_security_label_number: Option<&super::super::codec::Value> = None;
let mut raw_security_label_number_element: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"entityCodeableConcept" => {
raw_entity.value("CodeableConcept", value, path)?;
}
"_entityCodeableConcept" => {
raw_entity.element("CodeableConcept", value, path)?;
}
"entityReference" => {
raw_entity.value("Reference", value, path)?;
}
"_entityReference" => {
raw_entity.element("Reference", value, path)?;
}
"identifier" => {
raw_identifier = Some(value);
}
"effectiveTime" => {
raw_effective_time = Some(value);
}
"_effectiveTime" => {
raw_effective_time_element = Some(value);
}
"quantity" => {
raw_quantity = Some(value);
}
"unitPrice" => {
raw_unit_price = Some(value);
}
"factor" => {
raw_factor = Some(value);
}
"_factor" => {
raw_factor_element = Some(value);
}
"points" => {
raw_points = Some(value);
}
"_points" => {
raw_points_element = Some(value);
}
"net" => {
raw_net = Some(value);
}
"payment" => {
raw_payment = Some(value);
}
"_payment" => {
raw_payment_element = Some(value);
}
"paymentDate" => {
raw_payment_date = Some(value);
}
"_paymentDate" => {
raw_payment_date_element = Some(value);
}
"responsible" => {
raw_responsible = Some(value);
}
"recipient" => {
raw_recipient = Some(value);
}
"linkId" => {
raw_link_id = Some(value);
}
"_linkId" => {
raw_link_id_element = Some(value);
}
"securityLabelNumber" => {
raw_security_label_number = Some(value);
}
"_securityLabelNumber" => {
raw_security_label_number_element = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_entity = match raw_entity.suffix {
None => None,
Some(suffix) => Some(path.with("entity", |path| {
ContractTermAssetValuedItemEntity::from_json_parts(
suffix,
raw_entity.value,
raw_entity.element,
path,
)
})?),
};
let field_identifier = raw_identifier
.map(|value| {
path.with("identifier", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_effective_time = match (raw_effective_time, raw_effective_time_element) {
(None, None) => None,
(value, element) => Some(path.with("effectiveTime", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_quantity = raw_quantity
.map(|value| {
path.with("quantity", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_unit_price = raw_unit_price
.map(|value| {
path.with("unitPrice", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_factor = match (raw_factor, raw_factor_element) {
(None, None) => None,
(value, element) => Some(path.with("factor", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_points = match (raw_points, raw_points_element) {
(None, None) => None,
(value, element) => Some(path.with("points", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_net = raw_net
.map(|value| {
path.with("net", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_payment = match (raw_payment, raw_payment_element) {
(None, None) => None,
(value, element) => Some(path.with("payment", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_payment_date = match (raw_payment_date, raw_payment_date_element) {
(None, None) => None,
(value, element) => Some(path.with("paymentDate", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let field_responsible = raw_responsible
.map(|value| {
path.with("responsible", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_recipient = raw_recipient
.map(|value| {
path.with("recipient", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_link_id = Vec::new();
for (index, (value, element)) in
super::super::codec::pair_arrays(raw_link_id, raw_link_id_element, path)?
.into_iter()
.enumerate()
{
field_link_id.push(path.with_index("linkId", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let mut field_security_label_number = Vec::new();
for (index, (value, element)) in super::super::codec::pair_arrays(
raw_security_label_number,
raw_security_label_number_element,
path,
)?
.into_iter()
.enumerate()
{
field_security_label_number.push(path.with_index(
"securityLabelNumber",
index,
|path| super::super::codec::Primitive::from_json_parts(value, element, path),
)?);
}
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
entity: field_entity,
identifier: field_identifier,
effective_time: field_effective_time,
quantity: field_quantity,
unit_price: field_unit_price,
factor: field_factor,
points: field_points,
net: field_net,
payment: field_payment,
payment_date: field_payment_date,
responsible: field_responsible,
recipient: field_recipient,
link_id: field_link_id,
security_label_number: field_security_label_number,
})
}
}
impl serde::Serialize for ContractTermAssetValuedItem {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
if let Some(item) = &self.effective_time {
super::super::codec::element_entry(&mut map, "_effectiveTime", item)?;
}
if let Some(item) = &self.factor {
super::super::codec::element_entry(&mut map, "_factor", item)?;
}
super::super::codec::element_list_entry(&mut map, "_linkId", &self.link_id)?;
if let Some(item) = &self.payment {
super::super::codec::element_entry(&mut map, "_payment", item)?;
}
if let Some(item) = &self.payment_date {
super::super::codec::element_entry(&mut map, "_paymentDate", item)?;
}
if let Some(item) = &self.points {
super::super::codec::element_entry(&mut map, "_points", item)?;
}
super::super::codec::element_list_entry(
&mut map,
"_securityLabelNumber",
&self.security_label_number,
)?;
if let Some(item) = &self.effective_time {
super::super::codec::value_entry(&mut map, "effectiveTime", item)?;
}
match &self.entity {
Some(ContractTermAssetValuedItemEntity::CodeableConcept(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"entityCodeableConcept",
inner.as_ref(),
)?;
}
Some(ContractTermAssetValuedItemEntity::Reference(inner)) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"entityReference",
inner.as_ref(),
)?;
}
None => {}
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(item) = &self.factor {
super::super::codec::value_entry(&mut map, "factor", item)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if let Some(item) = &self.identifier {
serde::ser::SerializeMap::serialize_entry(&mut map, "identifier", item)?;
}
super::super::codec::value_list_entry(&mut map, "linkId", &self.link_id)?;
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
if let Some(item) = &self.net {
serde::ser::SerializeMap::serialize_entry(&mut map, "net", item)?;
}
if let Some(item) = &self.payment {
super::super::codec::value_entry(&mut map, "payment", item)?;
}
if let Some(item) = &self.payment_date {
super::super::codec::value_entry(&mut map, "paymentDate", item)?;
}
if let Some(item) = &self.points {
super::super::codec::value_entry(&mut map, "points", item)?;
}
if let Some(item) = &self.quantity {
serde::ser::SerializeMap::serialize_entry(&mut map, "quantity", item)?;
}
if let Some(item) = &self.recipient {
serde::ser::SerializeMap::serialize_entry(&mut map, "recipient", item)?;
}
if let Some(item) = &self.responsible {
serde::ser::SerializeMap::serialize_entry(&mut map, "responsible", item)?;
}
super::super::codec::value_list_entry(
&mut map,
"securityLabelNumber",
&self.security_label_number,
)?;
if let Some(item) = &self.unit_price {
serde::ser::SerializeMap::serialize_entry(&mut map, "unitPrice", item)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTermAssetValuedItem {
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("ContractTermAssetValuedItem");
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, PartialEq, Eq)]
pub enum ContractTermAssetValuedItemEntity {
CodeableConcept(Box<super::codeable_concept::CodeableConcept>),
Reference(Box<super::reference::Reference>),
}
impl ContractTermAssetValuedItemEntity {
pub fn to_json_parts(
&self,
) -> Result<
(
&'static str,
Option<super::super::codec::Value>,
Option<super::super::codec::Value>,
),
super::super::codec::EncodeError,
> {
match self {
Self::CodeableConcept(inner) => Ok((
"CodeableConcept",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Reference(inner) => Ok((
"Reference",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
}
}
pub fn from_json_parts(
suffix: &str,
value: Option<&super::super::codec::Value>,
element: Option<&super::super::codec::Value>,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match suffix {
"CodeableConcept" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::CodeableConcept(Box::new(inner)))
}
"Reference" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Reference(Box::new(inner)))
}
_ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ContractTermOffer {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub identifier: Vec<super::identifier::Identifier>,
pub party: Vec<ContractTermOfferParty>,
pub topic: Option<super::reference::Reference>,
pub r#type: Option<super::codeable_concept::CodeableConcept>,
pub decision: Option<super::codeable_concept::CodeableConcept>,
pub decision_mode: Vec<super::codeable_concept::CodeableConcept>,
pub answer: Vec<ContractTermOfferAnswer>,
pub text: Option<super::primitives::String>,
pub link_id: Vec<super::primitives::String>,
pub security_label_number: Vec<super::primitives::UnsignedInt>,
}
impl super::super::codec::Json for ContractTermOffer {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if !self.identifier.is_empty() {
let mut items = Vec::with_capacity(self.identifier.len());
for item in &self.identifier {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("identifier"),
super::super::codec::Value::Array(items),
);
}
if !self.party.is_empty() {
let mut items = Vec::with_capacity(self.party.len());
for item in &self.party {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("party"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.topic {
object.insert(
std::string::String::from("topic"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.r#type {
object.insert(
std::string::String::from("type"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if let Some(item) = &self.decision {
object.insert(
std::string::String::from("decision"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
);
}
if !self.decision_mode.is_empty() {
let mut items = Vec::with_capacity(self.decision_mode.len());
for item in &self.decision_mode {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("decisionMode"),
super::super::codec::Value::Array(items),
);
}
if !self.answer.is_empty() {
let mut items = Vec::with_capacity(self.answer.len());
for item in &self.answer {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("answer"),
super::super::codec::Value::Array(items),
);
}
if let Some(item) = &self.text {
if let Some(v) = super::super::codec::Primitive::value_json(item)? {
object.insert(std::string::String::from("text"), v);
}
if let Some(e) = super::super::codec::Primitive::element_json(item)? {
object.insert(std::string::String::from("_text"), e);
}
}
if !self.link_id.is_empty() {
let (values, elements) = super::super::codec::primitive_arrays(&self.link_id)?;
object.insert(std::string::String::from("linkId"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_linkId"), elements);
}
}
if !self.security_label_number.is_empty() {
let (values, elements) =
super::super::codec::primitive_arrays(&self.security_label_number)?;
object.insert(std::string::String::from("securityLabelNumber"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_securityLabelNumber"), elements);
}
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_identifier: Option<&super::super::codec::Value> = None;
let mut raw_party: Option<&super::super::codec::Value> = None;
let mut raw_topic: Option<&super::super::codec::Value> = None;
let mut raw_type: Option<&super::super::codec::Value> = None;
let mut raw_decision: Option<&super::super::codec::Value> = None;
let mut raw_decision_mode: Option<&super::super::codec::Value> = None;
let mut raw_answer: Option<&super::super::codec::Value> = None;
let mut raw_text: Option<&super::super::codec::Value> = None;
let mut raw_text_element: Option<&super::super::codec::Value> = None;
let mut raw_link_id: Option<&super::super::codec::Value> = None;
let mut raw_link_id_element: Option<&super::super::codec::Value> = None;
let mut raw_security_label_number: Option<&super::super::codec::Value> = None;
let mut raw_security_label_number_element: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"identifier" => {
raw_identifier = Some(value);
}
"party" => {
raw_party = Some(value);
}
"topic" => {
raw_topic = Some(value);
}
"type" => {
raw_type = Some(value);
}
"decision" => {
raw_decision = Some(value);
}
"decisionMode" => {
raw_decision_mode = Some(value);
}
"answer" => {
raw_answer = Some(value);
}
"text" => {
raw_text = Some(value);
}
"_text" => {
raw_text_element = Some(value);
}
"linkId" => {
raw_link_id = Some(value);
}
"_linkId" => {
raw_link_id_element = Some(value);
}
"securityLabelNumber" => {
raw_security_label_number = Some(value);
}
"_securityLabelNumber" => {
raw_security_label_number_element = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let mut field_identifier = Vec::new();
if let Some(raw) = raw_identifier {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_identifier.push(path.with_index("identifier", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_party = Vec::new();
if let Some(raw) = raw_party {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_party.push(path.with_index("party", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_topic = raw_topic
.map(|value| {
path.with("topic", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_type = raw_type
.map(|value| {
path.with("type", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let field_decision = raw_decision
.map(|value| {
path.with("decision", |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})
})
.transpose()?;
let mut field_decision_mode = Vec::new();
if let Some(raw) = raw_decision_mode {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_decision_mode.push(path.with_index("decisionMode", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_answer = Vec::new();
if let Some(raw) = raw_answer {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_answer.push(path.with_index("answer", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_text = match (raw_text, raw_text_element) {
(None, None) => None,
(value, element) => Some(path.with("text", |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?),
};
let mut field_link_id = Vec::new();
for (index, (value, element)) in
super::super::codec::pair_arrays(raw_link_id, raw_link_id_element, path)?
.into_iter()
.enumerate()
{
field_link_id.push(path.with_index("linkId", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let mut field_security_label_number = Vec::new();
for (index, (value, element)) in super::super::codec::pair_arrays(
raw_security_label_number,
raw_security_label_number_element,
path,
)?
.into_iter()
.enumerate()
{
field_security_label_number.push(path.with_index(
"securityLabelNumber",
index,
|path| super::super::codec::Primitive::from_json_parts(value, element, path),
)?);
}
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
identifier: field_identifier,
party: field_party,
topic: field_topic,
r#type: field_type,
decision: field_decision,
decision_mode: field_decision_mode,
answer: field_answer,
text: field_text,
link_id: field_link_id,
security_label_number: field_security_label_number,
})
}
}
impl serde::Serialize for ContractTermOffer {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
super::super::codec::element_list_entry(&mut map, "_linkId", &self.link_id)?;
super::super::codec::element_list_entry(
&mut map,
"_securityLabelNumber",
&self.security_label_number,
)?;
if let Some(item) = &self.text {
super::super::codec::element_entry(&mut map, "_text", item)?;
}
if !self.answer.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "answer", &self.answer)?;
}
if let Some(item) = &self.decision {
serde::ser::SerializeMap::serialize_entry(&mut map, "decision", item)?;
}
if !self.decision_mode.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"decisionMode",
&self.decision_mode,
)?;
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.identifier.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "identifier", &self.identifier)?;
}
super::super::codec::value_list_entry(&mut map, "linkId", &self.link_id)?;
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
if !self.party.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "party", &self.party)?;
}
super::super::codec::value_list_entry(
&mut map,
"securityLabelNumber",
&self.security_label_number,
)?;
if let Some(item) = &self.text {
super::super::codec::value_entry(&mut map, "text", item)?;
}
if let Some(item) = &self.topic {
serde::ser::SerializeMap::serialize_entry(&mut map, "topic", item)?;
}
if let Some(item) = &self.r#type {
serde::ser::SerializeMap::serialize_entry(&mut map, "type", item)?;
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTermOffer {
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("ContractTermOffer");
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, PartialEq, Eq)]
pub struct ContractTermOfferAnswer {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub value: ContractTermOfferAnswerValue,
}
impl super::super::codec::Json for ContractTermOfferAnswer {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
let (suffix, value, element) = self.value.to_json_parts()?;
if let Some(value) = value {
object.insert(format!("value{suffix}"), value);
}
if let Some(element) = element {
object.insert(format!("_value{suffix}"), element);
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_value = super::super::codec::ChoiceSlot::default();
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"valueBoolean" => {
raw_value.value("Boolean", value, path)?;
}
"_valueBoolean" => {
raw_value.element("Boolean", value, path)?;
}
"valueDecimal" => {
raw_value.value("Decimal", value, path)?;
}
"_valueDecimal" => {
raw_value.element("Decimal", value, path)?;
}
"valueInteger" => {
raw_value.value("Integer", value, path)?;
}
"_valueInteger" => {
raw_value.element("Integer", value, path)?;
}
"valueDate" => {
raw_value.value("Date", value, path)?;
}
"_valueDate" => {
raw_value.element("Date", value, path)?;
}
"valueDateTime" => {
raw_value.value("DateTime", value, path)?;
}
"_valueDateTime" => {
raw_value.element("DateTime", value, path)?;
}
"valueTime" => {
raw_value.value("Time", value, path)?;
}
"_valueTime" => {
raw_value.element("Time", value, path)?;
}
"valueString" => {
raw_value.value("String", value, path)?;
}
"_valueString" => {
raw_value.element("String", value, path)?;
}
"valueUri" => {
raw_value.value("Uri", value, path)?;
}
"_valueUri" => {
raw_value.element("Uri", value, path)?;
}
"valueAttachment" => {
raw_value.value("Attachment", value, path)?;
}
"_valueAttachment" => {
raw_value.element("Attachment", value, path)?;
}
"valueCoding" => {
raw_value.value("Coding", value, path)?;
}
"_valueCoding" => {
raw_value.element("Coding", value, path)?;
}
"valueQuantity" => {
raw_value.value("Quantity", value, path)?;
}
"_valueQuantity" => {
raw_value.element("Quantity", value, path)?;
}
"valueReference" => {
raw_value.value("Reference", value, path)?;
}
"_valueReference" => {
raw_value.element("Reference", value, path)?;
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let field_value = path.with("value", |path| {
let suffix = raw_value
.suffix
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
ContractTermOfferAnswerValue::from_json_parts(
suffix,
raw_value.value,
raw_value.element,
path,
)
})?;
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
value: field_value,
})
}
}
impl serde::Serialize for ContractTermOfferAnswer {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
match &self.value {
ContractTermOfferAnswerValue::Boolean(inner) => {
super::super::codec::element_entry(&mut map, "_valueBoolean", inner)?;
}
ContractTermOfferAnswerValue::Date(inner) => {
super::super::codec::element_entry(&mut map, "_valueDate", inner)?;
}
ContractTermOfferAnswerValue::DateTime(inner) => {
super::super::codec::element_entry(&mut map, "_valueDateTime", inner)?;
}
ContractTermOfferAnswerValue::Decimal(inner) => {
super::super::codec::element_entry(&mut map, "_valueDecimal", inner)?;
}
ContractTermOfferAnswerValue::Integer(inner) => {
super::super::codec::element_entry(&mut map, "_valueInteger", inner)?;
}
ContractTermOfferAnswerValue::String(inner) => {
super::super::codec::element_entry(&mut map, "_valueString", inner)?;
}
ContractTermOfferAnswerValue::Time(inner) => {
super::super::codec::element_entry(&mut map, "_valueTime", inner)?;
}
ContractTermOfferAnswerValue::Uri(inner) => {
super::super::codec::element_entry(&mut map, "_valueUri", inner)?;
}
_ => {}
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
match &self.value {
ContractTermOfferAnswerValue::Attachment(inner) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"valueAttachment",
inner.as_ref(),
)?;
}
ContractTermOfferAnswerValue::Boolean(inner) => {
super::super::codec::value_entry(&mut map, "valueBoolean", inner)?;
}
ContractTermOfferAnswerValue::Coding(inner) => {
serde::ser::SerializeMap::serialize_entry(&mut map, "valueCoding", inner.as_ref())?;
}
ContractTermOfferAnswerValue::Date(inner) => {
super::super::codec::value_entry(&mut map, "valueDate", inner)?;
}
ContractTermOfferAnswerValue::DateTime(inner) => {
super::super::codec::value_entry(&mut map, "valueDateTime", inner)?;
}
ContractTermOfferAnswerValue::Decimal(inner) => {
super::super::codec::value_entry(&mut map, "valueDecimal", inner)?;
}
ContractTermOfferAnswerValue::Integer(inner) => {
super::super::codec::value_entry(&mut map, "valueInteger", inner)?;
}
ContractTermOfferAnswerValue::Quantity(inner) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"valueQuantity",
inner.as_ref(),
)?;
}
ContractTermOfferAnswerValue::Reference(inner) => {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"valueReference",
inner.as_ref(),
)?;
}
ContractTermOfferAnswerValue::String(inner) => {
super::super::codec::value_entry(&mut map, "valueString", inner)?;
}
ContractTermOfferAnswerValue::Time(inner) => {
super::super::codec::value_entry(&mut map, "valueTime", inner)?;
}
ContractTermOfferAnswerValue::Uri(inner) => {
super::super::codec::value_entry(&mut map, "valueUri", inner)?;
}
}
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTermOfferAnswer {
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("ContractTermOfferAnswer");
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, PartialEq, Eq)]
pub enum ContractTermOfferAnswerValue {
Boolean(super::primitives::Boolean),
Decimal(super::primitives::Decimal),
Integer(super::primitives::Integer),
Date(super::primitives::Date),
DateTime(super::primitives::DateTime),
Time(super::primitives::Time),
String(super::primitives::String),
Uri(super::primitives::Uri),
Attachment(Box<super::attachment::Attachment>),
Coding(Box<super::coding::Coding>),
Quantity(Box<super::quantity::Quantity>),
Reference(Box<super::reference::Reference>),
}
impl ContractTermOfferAnswerValue {
pub fn to_json_parts(
&self,
) -> Result<
(
&'static str,
Option<super::super::codec::Value>,
Option<super::super::codec::Value>,
),
super::super::codec::EncodeError,
> {
match self {
Self::Boolean(inner) => Ok((
"Boolean",
super::super::codec::Primitive::value_json(inner)?,
super::super::codec::Primitive::element_json(inner)?,
)),
Self::Decimal(inner) => Ok((
"Decimal",
super::super::codec::Primitive::value_json(inner)?,
super::super::codec::Primitive::element_json(inner)?,
)),
Self::Integer(inner) => Ok((
"Integer",
super::super::codec::Primitive::value_json(inner)?,
super::super::codec::Primitive::element_json(inner)?,
)),
Self::Date(inner) => Ok((
"Date",
super::super::codec::Primitive::value_json(inner)?,
super::super::codec::Primitive::element_json(inner)?,
)),
Self::DateTime(inner) => Ok((
"DateTime",
super::super::codec::Primitive::value_json(inner)?,
super::super::codec::Primitive::element_json(inner)?,
)),
Self::Time(inner) => Ok((
"Time",
super::super::codec::Primitive::value_json(inner)?,
super::super::codec::Primitive::element_json(inner)?,
)),
Self::String(inner) => Ok((
"String",
super::super::codec::Primitive::value_json(inner)?,
super::super::codec::Primitive::element_json(inner)?,
)),
Self::Uri(inner) => Ok((
"Uri",
super::super::codec::Primitive::value_json(inner)?,
super::super::codec::Primitive::element_json(inner)?,
)),
Self::Attachment(inner) => Ok((
"Attachment",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Coding(inner) => Ok((
"Coding",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Quantity(inner) => Ok((
"Quantity",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Reference(inner) => Ok((
"Reference",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
}
}
pub fn from_json_parts(
suffix: &str,
value: Option<&super::super::codec::Value>,
element: Option<&super::super::codec::Value>,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match suffix {
"Boolean" => Ok(Self::Boolean(
super::super::codec::Primitive::from_json_parts(value, element, path)?,
)),
"Decimal" => Ok(Self::Decimal(
super::super::codec::Primitive::from_json_parts(value, element, path)?,
)),
"Integer" => Ok(Self::Integer(
super::super::codec::Primitive::from_json_parts(value, element, path)?,
)),
"Date" => Ok(Self::Date(super::super::codec::Primitive::from_json_parts(
value, element, path,
)?)),
"DateTime" => Ok(Self::DateTime(
super::super::codec::Primitive::from_json_parts(value, element, path)?,
)),
"Time" => Ok(Self::Time(super::super::codec::Primitive::from_json_parts(
value, element, path,
)?)),
"String" => Ok(Self::String(
super::super::codec::Primitive::from_json_parts(value, element, path)?,
)),
"Uri" => Ok(Self::Uri(super::super::codec::Primitive::from_json_parts(
value, element, path,
)?)),
"Attachment" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Attachment(Box::new(inner)))
}
"Coding" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Coding(Box::new(inner)))
}
"Quantity" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Quantity(Box::new(inner)))
}
"Reference" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Reference(Box::new(inner)))
}
_ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ContractTermOfferParty {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub reference: Vec<super::reference::Reference>,
pub role: super::codeable_concept::CodeableConcept,
}
impl super::super::codec::Json for ContractTermOfferParty {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if !self.reference.is_empty() {
let mut items = Vec::with_capacity(self.reference.len());
for item in &self.reference {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("reference"),
super::super::codec::Value::Array(items),
);
}
object.insert(
std::string::String::from("role"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.role)?),
);
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_reference: Option<&super::super::codec::Value> = None;
let mut raw_role: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"reference" => {
raw_reference = Some(value);
}
"role" => {
raw_role = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let mut field_reference = Vec::new();
if let Some(raw) = raw_reference {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_reference.push(path.with_index("reference", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let field_role = path.with("role", |path| {
let value = raw_role
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})?;
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
reference: field_reference,
role: field_role,
})
}
}
impl serde::Serialize for ContractTermOfferParty {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
if !self.reference.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "reference", &self.reference)?;
}
serde::ser::SerializeMap::serialize_entry(&mut map, "role", &self.role)?;
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTermOfferParty {
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("ContractTermOfferParty");
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 ContractTermSecurityLabel {
pub id: Option<std::string::String>,
pub extension: Vec<super::extension::Extension>,
pub modifier_extension: Vec<super::extension::Extension>,
pub number: Vec<super::primitives::UnsignedInt>,
pub classification: super::coding::Coding,
pub category: Vec<super::coding::Coding>,
pub control: Vec<super::coding::Coding>,
}
impl super::super::codec::Json for ContractTermSecurityLabel {
fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
let mut object = super::super::codec::Object::new();
if let Some(v) = &self.id {
object.insert(
std::string::String::from("id"),
super::super::codec::Value::String(v.clone()),
);
}
if !self.extension.is_empty() {
let mut items = Vec::with_capacity(self.extension.len());
for item in &self.extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("extension"),
super::super::codec::Value::Array(items),
);
}
if !self.modifier_extension.is_empty() {
let mut items = Vec::with_capacity(self.modifier_extension.len());
for item in &self.modifier_extension {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("modifierExtension"),
super::super::codec::Value::Array(items),
);
}
if !self.number.is_empty() {
let (values, elements) = super::super::codec::primitive_arrays(&self.number)?;
object.insert(std::string::String::from("number"), values);
if let Some(elements) = elements {
object.insert(std::string::String::from("_number"), elements);
}
}
object.insert(
std::string::String::from("classification"),
super::super::codec::Value::Object(super::super::codec::Json::to_json(
&self.classification,
)?),
);
if !self.category.is_empty() {
let mut items = Vec::with_capacity(self.category.len());
for item in &self.category {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("category"),
super::super::codec::Value::Array(items),
);
}
if !self.control.is_empty() {
let mut items = Vec::with_capacity(self.control.len());
for item in &self.control {
items.push(super::super::codec::Value::Object(
super::super::codec::Json::to_json(item)?,
));
}
object.insert(
std::string::String::from("control"),
super::super::codec::Value::Array(items),
);
}
Ok(object)
}
fn from_json(
object: &super::super::codec::Object,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
let mut raw_id: Option<&super::super::codec::Value> = None;
let mut raw_extension: Option<&super::super::codec::Value> = None;
let mut raw_modifier_extension: Option<&super::super::codec::Value> = None;
let mut raw_number: Option<&super::super::codec::Value> = None;
let mut raw_number_element: Option<&super::super::codec::Value> = None;
let mut raw_classification: Option<&super::super::codec::Value> = None;
let mut raw_category: Option<&super::super::codec::Value> = None;
let mut raw_control: Option<&super::super::codec::Value> = None;
for (key, value) in object {
match key.as_str() {
"id" => {
raw_id = Some(value);
}
"extension" => {
raw_extension = Some(value);
}
"modifierExtension" => {
raw_modifier_extension = Some(value);
}
"number" => {
raw_number = Some(value);
}
"_number" => {
raw_number_element = Some(value);
}
"classification" => {
raw_classification = Some(value);
}
"category" => {
raw_category = Some(value);
}
"control" => {
raw_control = Some(value);
}
other => {
return path.with(other, |path| {
Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
});
}
}
}
let field_id = raw_id
.map(|value| {
path.with("id", |path| {
let value = super::super::codec::expect_single(value, path)?;
super::primitives::checked_string(
super::super::codec::expect_string(value, path)?,
path,
)
})
})
.transpose()?;
let mut field_extension = Vec::new();
if let Some(raw) = raw_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_extension.push(path.with_index("extension", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_modifier_extension = Vec::new();
if let Some(raw) = raw_modifier_extension {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_modifier_extension.push(path.with_index(
"modifierExtension",
index,
|path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
},
)?);
}
}
let mut field_number = Vec::new();
for (index, (value, element)) in
super::super::codec::pair_arrays(raw_number, raw_number_element, path)?
.into_iter()
.enumerate()
{
field_number.push(path.with_index("number", index, |path| {
super::super::codec::Primitive::from_json_parts(value, element, path)
})?);
}
let field_classification = path.with("classification", |path| {
let value = raw_classification
.ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)
})?;
let mut field_category = Vec::new();
if let Some(raw) = raw_category {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_category.push(path.with_index("category", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
let mut field_control = Vec::new();
if let Some(raw) = raw_control {
for (index, value) in super::super::codec::expect_array(raw, path)?
.iter()
.enumerate()
{
field_control.push(path.with_index("control", index, |path| {
super::super::codec::Json::from_json(
super::super::codec::expect_object(value, path)?,
path,
)
})?);
}
}
Ok(Self {
id: field_id,
extension: field_extension,
modifier_extension: field_modifier_extension,
number: field_number,
classification: field_classification,
category: field_category,
control: field_control,
})
}
}
impl serde::Serialize for ContractTermSecurityLabel {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serde::Serializer::serialize_map(serializer, None)?;
super::super::codec::element_list_entry(&mut map, "_number", &self.number)?;
if !self.category.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "category", &self.category)?;
}
serde::ser::SerializeMap::serialize_entry(
&mut map,
"classification",
&self.classification,
)?;
if !self.control.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "control", &self.control)?;
}
if !self.extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
}
if let Some(v) = &self.id {
serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
}
if !self.modifier_extension.is_empty() {
serde::ser::SerializeMap::serialize_entry(
&mut map,
"modifierExtension",
&self.modifier_extension,
)?;
}
super::super::codec::value_list_entry(&mut map, "number", &self.number)?;
serde::ser::SerializeMap::end(map)
}
}
impl<'de> serde::Deserialize<'de> for ContractTermSecurityLabel {
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("ContractTermSecurityLabel");
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, PartialEq, Eq)]
pub enum ContractTermTopic {
CodeableConcept(Box<super::codeable_concept::CodeableConcept>),
Reference(Box<super::reference::Reference>),
}
impl ContractTermTopic {
pub fn to_json_parts(
&self,
) -> Result<
(
&'static str,
Option<super::super::codec::Value>,
Option<super::super::codec::Value>,
),
super::super::codec::EncodeError,
> {
match self {
Self::CodeableConcept(inner) => Ok((
"CodeableConcept",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Reference(inner) => Ok((
"Reference",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
}
}
pub fn from_json_parts(
suffix: &str,
value: Option<&super::super::codec::Value>,
element: Option<&super::super::codec::Value>,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match suffix {
"CodeableConcept" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::CodeableConcept(Box::new(inner)))
}
"Reference" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Reference(Box::new(inner)))
}
_ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ContractTopic {
CodeableConcept(Box<super::codeable_concept::CodeableConcept>),
Reference(Box<super::reference::Reference>),
}
impl ContractTopic {
pub fn to_json_parts(
&self,
) -> Result<
(
&'static str,
Option<super::super::codec::Value>,
Option<super::super::codec::Value>,
),
super::super::codec::EncodeError,
> {
match self {
Self::CodeableConcept(inner) => Ok((
"CodeableConcept",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
Self::Reference(inner) => Ok((
"Reference",
Some(super::super::codec::Value::Object(
super::super::codec::Json::to_json(inner.as_ref())?,
)),
None,
)),
}
}
pub fn from_json_parts(
suffix: &str,
value: Option<&super::super::codec::Value>,
element: Option<&super::super::codec::Value>,
path: &mut super::super::codec::Path,
) -> Result<Self, super::super::codec::DecodeError> {
match suffix {
"CodeableConcept" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::CodeableConcept(Box::new(inner)))
}
"Reference" => {
if element.is_some() {
return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
expected: "no underscore form for a complex type",
}));
}
let value = value.ok_or_else(|| {
path.error(super::super::codec::DecodeErrorKind::MissingProperty)
})?;
let inner = super::super::codec::Json::from_json(
super::super::codec::expect_object(
super::super::codec::expect_single(value, path)?,
path,
)?,
path,
)?;
Ok(Self::Reference(Box::new(inner)))
}
_ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
}
}
}