#![cfg_attr(
not(feature = "builders"),
allow(
dead_code,
unused_imports,
unused_macros,
reason = "Many impls missing without builders"
)
)]
use std::{
fmt::{Debug, Display},
str::FromStr,
};
use fhir_model::for_all_versions;
use serde::{Serialize, de::DeserializeOwned};
use crate::{
extensions::{BundleEntryExt, BundleExt, GenericResource, ParametersExt, ReferenceExt},
utils::Sealed,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct FhirStu3;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct FhirR4B;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct FhirR5;
#[cfg(feature = "r5")]
pub type DefaultVersion = FhirR5;
#[cfg(all(not(feature = "r5"), feature = "r4b"))]
pub type DefaultVersion = FhirR4B;
#[cfg(all(not(feature = "r5"), not(feature = "r4b"), feature = "stu3"))]
pub type DefaultVersion = FhirStu3;
macro_rules! fhir_version {
(stu3) => {
$crate::version::FhirStu3
};
(r4b) => {
$crate::version::FhirR4B
};
(r5) => {
$crate::version::FhirR5
};
}
pub(crate) use fhir_version;
pub trait FhirVersion: Sealed + Unpin + Send + Sync + 'static {
const VERSION: &'static str;
const MIME_TYPE: &'static str;
type ResourceType: Serialize
+ DeserializeOwned
+ Debug
+ FromStr
+ AsRef<str>
+ Display
+ Clone
+ Copy
+ PartialEq
+ Eq
+ Unpin
+ Send
+ Sync;
type Resource: GenericResource
+ Serialize
+ DeserializeOwned
+ Debug
+ Clone
+ PartialEq
+ Unpin
+ Send
+ Sync;
type Bundle: BundleExt<Entry: BundleEntryExt<Resource = Self::Resource>>
+ Serialize
+ DeserializeOwned
+ Debug
+ Clone
+ PartialEq
+ Unpin
+ Send
+ Sync;
type CapabilityStatement: Serialize
+ DeserializeOwned
+ Debug
+ Clone
+ PartialEq
+ Unpin
+ Send
+ Sync;
type OperationOutcome: Serialize
+ DeserializeOwned
+ Debug
+ Clone
+ PartialEq
+ Unpin
+ Send
+ Sync;
type Parameters: ParametersExt
+ Serialize
+ DeserializeOwned
+ Debug
+ Clone
+ PartialEq
+ Unpin
+ Send
+ Sync;
type Reference: ReferenceExt
+ Serialize
+ DeserializeOwned
+ Debug
+ Clone
+ PartialEq
+ Unpin
+ Send
+ Sync;
type SearchComparator: Serialize
+ DeserializeOwned
+ Debug
+ FromStr
+ AsRef<str>
+ Display
+ Clone
+ Copy
+ PartialEq
+ Eq
+ Unpin
+ Send
+ Sync;
}
impl Sealed for FhirStu3 {}
impl Sealed for FhirR4B {}
impl Sealed for FhirR5 {}
macro_rules! impl_fhir_version {
($version:ident) => {
use fhir_model::$version;
impl FhirVersion for fhir_version!($version) {
const VERSION: &'static str = $version::VERSION;
const MIME_TYPE: &'static str = $version::JSON_MIME_TYPE;
type ResourceType = $version::resources::ResourceType;
type Resource = $version::resources::Resource;
type Bundle = $version::resources::Bundle;
type CapabilityStatement = $version::resources::CapabilityStatement;
type OperationOutcome = $version::resources::OperationOutcome;
type Parameters = $version::resources::Parameters;
type Reference = $version::types::Reference;
type SearchComparator = $version::codes::SearchComparator;
}
};
}
#[cfg(feature = "builders")] for_all_versions!(impl_fhir_version);