From aaa520347dbeca18f04e55a3b400c14c96db1751 Mon Sep 17 00:00:00 2001 From: Flix Date: Wed, 6 Sep 2023 22:12:17 +0200 Subject: [PATCH] feat: Implement creation of References --- Cargo.toml | 3 +- crates/fhir-model/Cargo.toml | 3 +- crates/fhir-model/src/r4b/mod.rs | 1 + crates/fhir-model/src/r4b/reference.rs | 51 ++++++++++++++++++++++++++ crates/fhir-model/src/r5/mod.rs | 1 + crates/fhir-model/src/r5/reference.rs | 51 ++++++++++++++++++++++++++ 6 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 crates/fhir-model/src/r4b/reference.rs create mode 100644 crates/fhir-model/src/r5/reference.rs diff --git a/Cargo.toml b/Cargo.toml index 3afec825..ee4dcc3b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ resolver = "2" [profile.dev.build-override] opt-level = 2 - +[profile.test.build-override] +opt-level = 2 [profile.release.build-override] opt-level = 2 diff --git a/crates/fhir-model/Cargo.toml b/crates/fhir-model/Cargo.toml index e92eef4d..2b06567b 100644 --- a/crates/fhir-model/Cargo.toml +++ b/crates/fhir-model/Cargo.toml @@ -29,7 +29,8 @@ serde_json = "1.0.94" [profile.dev.build-override] opt-level = 2 - +[profile.test.build-override] +opt-level = 2 [profile.release.build-override] opt-level = 2 diff --git a/crates/fhir-model/src/r4b/mod.rs b/crates/fhir-model/src/r4b/mod.rs index adfaea22..efbf9562 100644 --- a/crates/fhir-model/src/r4b/mod.rs +++ b/crates/fhir-model/src/r4b/mod.rs @@ -1,6 +1,7 @@ //! Revision 4B types of FHIR. pub mod codes; +pub mod reference; pub mod resources; pub mod types; diff --git a/crates/fhir-model/src/r4b/reference.rs b/crates/fhir-model/src/r4b/reference.rs new file mode 100644 index 00000000..21c725c7 --- /dev/null +++ b/crates/fhir-model/src/r4b/reference.rs @@ -0,0 +1,51 @@ +//! Extended [`Reference`] functionality. + +use super::{ + resources::{BaseResource, NamedResource}, + types::{Reference, ReferenceInner}, +}; + +/// Create relative [`Reference`] to the given resource. +pub fn create_to(resource: R) -> Option +where + R: NamedResource + BaseResource, +{ + Some( + ReferenceInner { + id: None, + extension: Vec::new(), + reference: Some(format!("{}/{}", R::TYPE, resource.id().as_ref()?)), + reference_ext: None, + r#type: Some(R::TYPE.to_string()), + type_ext: None, + identifier: None, + identifier_ext: None, + display: None, + display_ext: None, + } + .into(), + ) +} + +/// Create local [`Reference`] to the given resource. Make sure the resource is +/// going to be in the `contained` field of the referencing resource. +pub fn create_local_to(resource: R) -> Option +where + R: NamedResource + BaseResource, +{ + Some( + ReferenceInner { + id: None, + extension: Vec::new(), + reference: Some(format!("#{}", resource.id().as_ref()?)), + reference_ext: None, + r#type: Some(R::TYPE.to_string()), + type_ext: None, + identifier: None, + identifier_ext: None, + display: None, + display_ext: None, + } + .into(), + ) +} diff --git a/crates/fhir-model/src/r5/mod.rs b/crates/fhir-model/src/r5/mod.rs index d78a8f1e..05f60157 100644 --- a/crates/fhir-model/src/r5/mod.rs +++ b/crates/fhir-model/src/r5/mod.rs @@ -1,6 +1,7 @@ //! Revision 5 types of FHIR. pub mod codes; +pub mod reference; pub mod resources; pub mod types; diff --git a/crates/fhir-model/src/r5/reference.rs b/crates/fhir-model/src/r5/reference.rs new file mode 100644 index 00000000..21c725c7 --- /dev/null +++ b/crates/fhir-model/src/r5/reference.rs @@ -0,0 +1,51 @@ +//! Extended [`Reference`] functionality. + +use super::{ + resources::{BaseResource, NamedResource}, + types::{Reference, ReferenceInner}, +}; + +/// Create relative [`Reference`] to the given resource. +pub fn create_to(resource: R) -> Option +where + R: NamedResource + BaseResource, +{ + Some( + ReferenceInner { + id: None, + extension: Vec::new(), + reference: Some(format!("{}/{}", R::TYPE, resource.id().as_ref()?)), + reference_ext: None, + r#type: Some(R::TYPE.to_string()), + type_ext: None, + identifier: None, + identifier_ext: None, + display: None, + display_ext: None, + } + .into(), + ) +} + +/// Create local [`Reference`] to the given resource. Make sure the resource is +/// going to be in the `contained` field of the referencing resource. +pub fn create_local_to(resource: R) -> Option +where + R: NamedResource + BaseResource, +{ + Some( + ReferenceInner { + id: None, + extension: Vec::new(), + reference: Some(format!("#{}", resource.id().as_ref()?)), + reference_ext: None, + r#type: Some(R::TYPE.to_string()), + type_ext: None, + identifier: None, + identifier_ext: None, + display: None, + display_ext: None, + } + .into(), + ) +}