fhirkit 0.1.0

FHIR R4 for Rust: typed models for every resource and datatype generated from the official specification, lossless JSON with path-precise validation, typed search queries, FHIRPath
Documentation
// @generated by fhirkit-gen from hl7.fhir.r4.core 4.0.1. Do not edit.
//! The FHIR R4 `ImagingStudy` resource.

#![allow(
    unused_imports,
    clippy::large_enum_variant,
    clippy::too_many_lines,
    clippy::doc_markdown
)]

use crate::decode::{
    choice_key, required, required_list, resource_type, Choice, Decoder, FhirJson, Obj, ObjWriter,
};
use crate::json::Json;
use crate::primitive::{Decimal, Kind, Primitive};
use crate::r4::*;

/// Representation of the content produced in a DICOM imaging study. A study comprises a set of series, each of which includes a set of Service-Object Pair Instances (SOP Instances - images or other data) acquired or produced in a common context. A series is of only one modality (e.g. X-ray, CT, MR, ultrasound), but a study may have multiple series of different modalities.
///
/// FHIR path: `ImagingStudy`.
#[cfg(feature = "clinical")]
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ImagingStudy {
    /// `id` (0..1): Logical id of this artifact
    pub id: Option<String>,
    /// `meta` (0..1): Metadata about the resource
    pub meta: Option<Meta>,
    /// `implicitRules` (0..1): A set of rules under which this content was created
    pub implicit_rules: Option<Primitive<String>>,
    /// `language` (0..1): Language of the resource content
    pub language: Option<Primitive<String>>,
    /// `text` (0..1): Text summary of the resource, for human interpretation
    pub text: Option<Narrative>,
    /// `contained` (0..*): Contained, inline Resources
    pub contained: Vec<Resource>,
    /// `extension` (0..*): Additional content defined by implementations
    pub extension: Vec<Extension>,
    /// `modifierExtension` (0..*): Extensions that cannot be ignored
    pub modifier_extension: Vec<Extension>,
    /// `identifier` (0..*): Identifiers for the whole study
    pub identifier: Vec<Identifier>,
    /// `status` (1..1): registered | available | cancelled | entered-in-error | unknown
    pub status: Option<Primitive<String>>,
    /// `modality` (0..*): All series modality if actual acquisition modalities
    pub modality: Vec<Coding>,
    /// `subject` (1..1): Who or what is the subject of the study
    pub subject: Option<Reference>,
    /// `encounter` (0..1): Encounter with which this imaging study is associated
    pub encounter: Option<Reference>,
    /// `started` (0..1): When the study was started
    pub started: Option<Primitive<String>>,
    /// `basedOn` (0..*): Request fulfilled
    pub based_on: Vec<Reference>,
    /// `referrer` (0..1): Referring physician
    pub referrer: Option<Reference>,
    /// `interpreter` (0..*): Who interpreted images
    pub interpreter: Vec<Reference>,
    /// `endpoint` (0..*): Study access endpoint
    pub endpoint: Vec<Reference>,
    /// `numberOfSeries` (0..1): Number of Study Related Series
    pub number_of_series: Option<Primitive<i32>>,
    /// `numberOfInstances` (0..1): Number of Study Related Instances
    pub number_of_instances: Option<Primitive<i32>>,
    /// `procedureReference` (0..1): The performed Procedure reference
    pub procedure_reference: Option<Reference>,
    /// `procedureCode` (0..*): The performed procedure code
    pub procedure_code: Vec<CodeableConcept>,
    /// `location` (0..1): Where ImagingStudy occurred
    pub location: Option<Reference>,
    /// `reasonCode` (0..*): Why the study was requested
    pub reason_code: Vec<CodeableConcept>,
    /// `reasonReference` (0..*): Why was study performed
    pub reason_reference: Vec<Reference>,
    /// `note` (0..*): User-defined comments
    pub note: Vec<Annotation>,
    /// `description` (0..1): Institution-generated description
    pub description: Option<Primitive<String>>,
    /// `series` (0..*): Each study has one or more series of instances
    pub series: Vec<ImagingStudySeries>,
}

#[cfg(feature = "clinical")]
impl FhirJson for ImagingStudy {
    const TYPE_NAME: &'static str = "ImagingStudy";

    fn decode(v: &Json, d: &mut Decoder) -> Option<Self> {
        let mut o = Obj::new(v, d)?;
        resource_type(&mut o, d, "ImagingStudy");
        let r = ImagingStudy {
            id: o.string(d, "id"),
            meta: o.one(d, "meta"),
            implicit_rules: o.prim(d, "implicitRules", Kind::Uri),
            language: o.prim(d, "language", Kind::Code),
            text: o.one(d, "text"),
            contained: o.list(d, "contained"),
            extension: o.list(d, "extension"),
            modifier_extension: o.list(d, "modifierExtension"),
            identifier: o.list(d, "identifier"),
            status: o.prim(d, "status", Kind::Code),
            modality: o.list(d, "modality"),
            subject: o.one(d, "subject"),
            encounter: o.one(d, "encounter"),
            started: o.prim(d, "started", Kind::DateTime),
            based_on: o.list(d, "basedOn"),
            referrer: o.one(d, "referrer"),
            interpreter: o.list(d, "interpreter"),
            endpoint: o.list(d, "endpoint"),
            number_of_series: o.prim(d, "numberOfSeries", Kind::UnsignedInt),
            number_of_instances: o.prim(d, "numberOfInstances", Kind::UnsignedInt),
            procedure_reference: o.one(d, "procedureReference"),
            procedure_code: o.list(d, "procedureCode"),
            location: o.one(d, "location"),
            reason_code: o.list(d, "reasonCode"),
            reason_reference: o.list(d, "reasonReference"),
            note: o.list(d, "note"),
            description: o.prim(d, "description", Kind::String),
            series: o.list(d, "series"),
        };
        required(d, "status", &r.status);
        required(d, "subject", &r.subject);
        o.finish(d);
        Some(r)
    }

    fn encode(&self) -> Json {
        let mut w = ObjWriter::new();
        w.raw("resourceType", Json::String("ImagingStudy".into()));
        w.string("id", &self.id);
        w.one("meta", &self.meta);
        w.prim("implicitRules", &self.implicit_rules);
        w.prim("language", &self.language);
        w.one("text", &self.text);
        w.list("contained", &self.contained);
        w.list("extension", &self.extension);
        w.list("modifierExtension", &self.modifier_extension);
        w.list("identifier", &self.identifier);
        w.prim("status", &self.status);
        w.list("modality", &self.modality);
        w.one("subject", &self.subject);
        w.one("encounter", &self.encounter);
        w.prim("started", &self.started);
        w.list("basedOn", &self.based_on);
        w.one("referrer", &self.referrer);
        w.list("interpreter", &self.interpreter);
        w.list("endpoint", &self.endpoint);
        w.prim("numberOfSeries", &self.number_of_series);
        w.prim("numberOfInstances", &self.number_of_instances);
        w.one("procedureReference", &self.procedure_reference);
        w.list("procedureCode", &self.procedure_code);
        w.one("location", &self.location);
        w.list("reasonCode", &self.reason_code);
        w.list("reasonReference", &self.reason_reference);
        w.list("note", &self.note);
        w.prim("description", &self.description);
        w.list("series", &self.series);
        w.finish()
    }
}

/// Each study has one or more series of instances
///
/// FHIR path: `ImagingStudy.series`.
#[cfg(feature = "clinical")]
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ImagingStudySeries {
    /// `id` (0..1): Unique id for inter-element referencing
    pub id: Option<String>,
    /// `extension` (0..*): Additional content defined by implementations
    pub extension: Vec<Extension>,
    /// `modifierExtension` (0..*): Extensions that cannot be ignored even if unrecognized
    pub modifier_extension: Vec<Extension>,
    /// `uid` (1..1): DICOM Series Instance UID for the series
    pub uid: Option<Primitive<String>>,
    /// `number` (0..1): Numeric identifier of this series
    pub number: Option<Primitive<i32>>,
    /// `modality` (1..1): The modality of the instances in the series
    pub modality: Option<Coding>,
    /// `description` (0..1): A short human readable summary of the series
    pub description: Option<Primitive<String>>,
    /// `numberOfInstances` (0..1): Number of Series Related Instances
    pub number_of_instances: Option<Primitive<i32>>,
    /// `endpoint` (0..*): Series access endpoint
    pub endpoint: Vec<Reference>,
    /// `bodySite` (0..1): Body part examined
    pub body_site: Option<Coding>,
    /// `laterality` (0..1): Body part laterality
    pub laterality: Option<Coding>,
    /// `specimen` (0..*): Specimen imaged
    pub specimen: Vec<Reference>,
    /// `started` (0..1): When the series started
    pub started: Option<Primitive<String>>,
    /// `performer` (0..*): Who performed the series
    pub performer: Vec<ImagingStudySeriesPerformer>,
    /// `instance` (0..*): A single SOP instance from the series
    pub instance: Vec<ImagingStudySeriesInstance>,
}

#[cfg(feature = "clinical")]
impl FhirJson for ImagingStudySeries {
    const TYPE_NAME: &'static str = "ImagingStudySeries";

    fn decode(v: &Json, d: &mut Decoder) -> Option<Self> {
        let mut o = Obj::new(v, d)?;
        let r = ImagingStudySeries {
            id: o.string(d, "id"),
            extension: o.list(d, "extension"),
            modifier_extension: o.list(d, "modifierExtension"),
            uid: o.prim(d, "uid", Kind::Id),
            number: o.prim(d, "number", Kind::UnsignedInt),
            modality: o.one(d, "modality"),
            description: o.prim(d, "description", Kind::String),
            number_of_instances: o.prim(d, "numberOfInstances", Kind::UnsignedInt),
            endpoint: o.list(d, "endpoint"),
            body_site: o.one(d, "bodySite"),
            laterality: o.one(d, "laterality"),
            specimen: o.list(d, "specimen"),
            started: o.prim(d, "started", Kind::DateTime),
            performer: o.list(d, "performer"),
            instance: o.list(d, "instance"),
        };
        required(d, "uid", &r.uid);
        required(d, "modality", &r.modality);
        o.finish(d);
        Some(r)
    }

    fn encode(&self) -> Json {
        let mut w = ObjWriter::new();
        w.string("id", &self.id);
        w.list("extension", &self.extension);
        w.list("modifierExtension", &self.modifier_extension);
        w.prim("uid", &self.uid);
        w.prim("number", &self.number);
        w.one("modality", &self.modality);
        w.prim("description", &self.description);
        w.prim("numberOfInstances", &self.number_of_instances);
        w.list("endpoint", &self.endpoint);
        w.one("bodySite", &self.body_site);
        w.one("laterality", &self.laterality);
        w.list("specimen", &self.specimen);
        w.prim("started", &self.started);
        w.list("performer", &self.performer);
        w.list("instance", &self.instance);
        w.finish()
    }
}

/// Who performed the series
///
/// FHIR path: `ImagingStudy.series.performer`.
#[cfg(feature = "clinical")]
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ImagingStudySeriesPerformer {
    /// `id` (0..1): Unique id for inter-element referencing
    pub id: Option<String>,
    /// `extension` (0..*): Additional content defined by implementations
    pub extension: Vec<Extension>,
    /// `modifierExtension` (0..*): Extensions that cannot be ignored even if unrecognized
    pub modifier_extension: Vec<Extension>,
    /// `function` (0..1): Type of performance
    pub function: Option<CodeableConcept>,
    /// `actor` (1..1): Who performed the series
    pub actor: Option<Reference>,
}

#[cfg(feature = "clinical")]
impl FhirJson for ImagingStudySeriesPerformer {
    const TYPE_NAME: &'static str = "ImagingStudySeriesPerformer";

    fn decode(v: &Json, d: &mut Decoder) -> Option<Self> {
        let mut o = Obj::new(v, d)?;
        let r = ImagingStudySeriesPerformer {
            id: o.string(d, "id"),
            extension: o.list(d, "extension"),
            modifier_extension: o.list(d, "modifierExtension"),
            function: o.one(d, "function"),
            actor: o.one(d, "actor"),
        };
        required(d, "actor", &r.actor);
        o.finish(d);
        Some(r)
    }

    fn encode(&self) -> Json {
        let mut w = ObjWriter::new();
        w.string("id", &self.id);
        w.list("extension", &self.extension);
        w.list("modifierExtension", &self.modifier_extension);
        w.one("function", &self.function);
        w.one("actor", &self.actor);
        w.finish()
    }
}

/// A single SOP instance from the series
///
/// FHIR path: `ImagingStudy.series.instance`.
#[cfg(feature = "clinical")]
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ImagingStudySeriesInstance {
    /// `id` (0..1): Unique id for inter-element referencing
    pub id: Option<String>,
    /// `extension` (0..*): Additional content defined by implementations
    pub extension: Vec<Extension>,
    /// `modifierExtension` (0..*): Extensions that cannot be ignored even if unrecognized
    pub modifier_extension: Vec<Extension>,
    /// `uid` (1..1): DICOM SOP Instance UID
    pub uid: Option<Primitive<String>>,
    /// `sopClass` (1..1): DICOM class type
    pub sop_class: Option<Coding>,
    /// `number` (0..1): The number of this instance in the series
    pub number: Option<Primitive<i32>>,
    /// `title` (0..1): Description of instance
    pub title: Option<Primitive<String>>,
}

#[cfg(feature = "clinical")]
impl FhirJson for ImagingStudySeriesInstance {
    const TYPE_NAME: &'static str = "ImagingStudySeriesInstance";

    fn decode(v: &Json, d: &mut Decoder) -> Option<Self> {
        let mut o = Obj::new(v, d)?;
        let r = ImagingStudySeriesInstance {
            id: o.string(d, "id"),
            extension: o.list(d, "extension"),
            modifier_extension: o.list(d, "modifierExtension"),
            uid: o.prim(d, "uid", Kind::Id),
            sop_class: o.one(d, "sopClass"),
            number: o.prim(d, "number", Kind::UnsignedInt),
            title: o.prim(d, "title", Kind::String),
        };
        required(d, "uid", &r.uid);
        required(d, "sopClass", &r.sop_class);
        o.finish(d);
        Some(r)
    }

    fn encode(&self) -> Json {
        let mut w = ObjWriter::new();
        w.string("id", &self.id);
        w.list("extension", &self.extension);
        w.list("modifierExtension", &self.modifier_extension);
        w.prim("uid", &self.uid);
        w.one("sopClass", &self.sop_class);
        w.prim("number", &self.number);
        w.prim("title", &self.title);
        w.finish()
    }
}