#![allow(unused_imports)]
use crate::r4::types;
use ::serde::{Deserialize, Serialize};
use fhir_derive_macros::{Builder, Validate};
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate, Builder)]
#[serde(rename_all = "camelCase")]
#[fhir_version("r4")]
pub struct Extension {
pub id: Option<types::String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extension: Vec<types::Extension>,
pub url: types::String,
#[serde(flatten)]
pub value: Option<ExtensionValue>,
}
#[derive(Debug, Clone, PartialEq, Eq, fhir_derive_macros::FhirChoice, Validate)]
#[fhir_version("r4")]
#[allow(clippy::large_enum_variant)]
pub enum ExtensionValue {
#[fhir("valueBase64Binary")]
Base64Binary(crate::r4::choice::Primitive<types::Base64Binary>),
#[fhir("valueBoolean")]
Boolean(crate::r4::choice::Primitive<types::Boolean>),
#[fhir("valueCanonical")]
Canonical(crate::r4::choice::Primitive<types::Canonical>),
#[fhir("valueCode")]
Code(crate::r4::choice::Primitive<types::Code>),
#[fhir("valueDate")]
Date(crate::r4::choice::Primitive<types::Date>),
#[fhir("valueDateTime")]
DateTime(crate::r4::choice::Primitive<types::DateTime>),
#[fhir("valueDecimal")]
Decimal(crate::r4::choice::Primitive<types::Decimal>),
#[fhir("valueId")]
Id(crate::r4::choice::Primitive<types::Id>),
#[fhir("valueInstant")]
Instant(crate::r4::choice::Primitive<types::Instant>),
#[fhir("valueInteger")]
Integer(crate::r4::choice::Primitive<types::Integer>),
#[fhir("valueMarkdown")]
Markdown(crate::r4::choice::Primitive<types::Markdown>),
#[fhir("valueOid")]
Oid(crate::r4::choice::Primitive<types::Oid>),
#[fhir("valuePositiveInt")]
PositiveInt(crate::r4::choice::Primitive<types::PositiveInt>),
#[fhir("valueString")]
String(crate::r4::choice::Primitive<types::String>),
#[fhir("valueTime")]
Time(crate::r4::choice::Primitive<types::Time>),
#[fhir("valueUnsignedInt")]
UnsignedInt(crate::r4::choice::Primitive<types::UnsignedInt>),
#[fhir("valueUri")]
Uri(crate::r4::choice::Primitive<types::Uri>),
#[fhir("valueUrl")]
Url(crate::r4::choice::Primitive<types::Url>),
#[fhir("valueUuid")]
Uuid(crate::r4::choice::Primitive<types::Uuid>),
#[fhir("valueAddress")]
Address(Box<types::Address>),
#[fhir("valueAge")]
Age(Box<types::Age>),
#[fhir("valueAnnotation")]
Annotation(Box<types::Annotation>),
#[fhir("valueAttachment")]
Attachment(Box<types::Attachment>),
#[fhir("valueCodeableConcept")]
CodeableConcept(Box<types::CodeableConcept>),
#[fhir("valueCoding")]
Coding(Box<types::Coding>),
#[fhir("valueContactPoint")]
ContactPoint(Box<types::ContactPoint>),
#[fhir("valueCount")]
Count(Box<types::Count>),
#[fhir("valueDistance")]
Distance(Box<types::Distance>),
#[fhir("valueDuration")]
Duration(Box<types::Duration>),
#[fhir("valueHumanName")]
HumanName(Box<types::HumanName>),
#[fhir("valueIdentifier")]
Identifier(Box<types::Identifier>),
#[fhir("valueMoney")]
Money(Box<types::Money>),
#[fhir("valuePeriod")]
Period(Box<types::Period>),
#[fhir("valueQuantity")]
Quantity(Box<types::Quantity>),
#[fhir("valueRange")]
Range(Box<types::Range>),
#[fhir("valueRatio")]
Ratio(Box<types::Ratio>),
#[fhir("valueReference")]
Reference(Box<types::Reference>),
#[fhir("valueSampledData")]
SampledData(Box<types::SampledData>),
#[fhir("valueSignature")]
Signature(Box<types::Signature>),
#[fhir("valueTiming")]
Timing(Box<types::Timing>),
#[fhir("valueContactDetail")]
ContactDetail(Box<types::ContactDetail>),
#[fhir("valueContributor")]
Contributor(Box<types::Contributor>),
#[fhir("valueDataRequirement")]
DataRequirement(Box<types::DataRequirement>),
#[fhir("valueExpression")]
Expression(Box<types::Expression>),
#[fhir("valueParameterDefinition")]
ParameterDefinition(Box<types::ParameterDefinition>),
#[fhir("valueRelatedArtifact")]
RelatedArtifact(Box<types::RelatedArtifact>),
#[fhir("valueTriggerDefinition")]
TriggerDefinition(Box<types::TriggerDefinition>),
#[fhir("valueUsageContext")]
UsageContext(Box<types::UsageContext>),
#[fhir("valueDosage")]
Dosage(Box<types::Dosage>),
#[fhir("valueMeta")]
Meta(Box<types::Meta>),
}
#[cfg(test)]
mod tests {
use super::*;
type T = Extension;
#[test]
fn test_default() {
let _ = T::default();
}
#[test]
fn test_serde_round_trip() {
let value = T::default();
let json = ::serde_json::to_value(&value).expect("to_value");
let back: T = ::serde_json::from_value(json).expect("from_value");
assert_eq!(value, back);
}
}