Crates.io | fhir-sdk |
lib.rs | fhir-sdk |
version | 0.12.0 |
source | src |
created_at | 2023-03-24 18:37:28.650828 |
updated_at | 2024-05-26 12:05:39.134022 |
description | FHIR Software Development Kit. Library for interfacing with FHIR. |
homepage | https://github.com/FlixCoder/fhir-sdk |
repository | https://github.com/FlixCoder/fhir-sdk |
max_upload_size | |
id | 819612 |
size | 240,495 |
This is a FHIR library in its early stages. The models are generated from the FHIR StructureDefinitions (see FHIR downloads). It aims to be:
use fhir_sdk::r5::resources::Patient;
use fhir_sdk::client::{*, r5::*};
use fhir_sdk::TryStreamExt;
#[tokio::main]
async fn main() -> Result<(), Error> {
// Set up the client using the local test server.
let settings = RequestSettings::default()
.header(header::AUTHORIZATION, "Bearer <token>".parse().unwrap());
let client = Client::builder()
.base_url("http://localhost:8100/fhir/".parse().unwrap())
.request_settings(settings)
.build()?;
// Create a Patient resource using a builder.
let mut patient = Patient::builder().active(false).build().unwrap();
// Push it to the server.
patient.create(&client).await?;
// The id and versionId is updated automatically this way.
assert!(patient.id.is_some());
// Search for all patient with `active` = false, including pagination.
let patients: Vec<Patient> = client
.search(SearchParameters::empty().and(TokenSearch::Standard {
name: "active",
system: None,
code: Some("false"),
not: false,
}))
.try_collect()
.await?;
Ok(())
}
For more examples, see the tests or below.
Simply set up the FHIR test environment using cargo xtask docker -- up -d
and then run cargo xtask test
.
If you need sudo to run docker, use the --sudo
or just -s
flag on cargo xtask docker
.
Vec<Option<T>>
is annoying, but sadly is required to allow [null, {...}, null]
for using FHIR resources with extensions..use fhir_sdk::r5::resources::Resource;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let resource_str = r#"{
"resourceType": "Patient",
"id": "my-id",
"birthDate": "2024-01-01"
}"#;
let _resource: Resource = serde_json::from_str(resource_str)?;
Ok(())
}
use fhir_sdk::r5::resources::Patient;
use fhir_sdk::client::*;
async fn my_auth_callback() -> Result<HeaderValue, eyre::Report> {
Ok(HeaderValue::from_static("Bearer <token>"))
}
#[tokio::main]
async fn main() -> Result<(), Error> {
// Set up the client using the local test server.
let client = Client::builder()
.base_url("http://localhost:8100/fhir/".parse().unwrap())
.auth_callback(my_auth_callback)
.build()?;
// Create a Patient resource using a builder.
let mut patient = Patient::builder().active(false).build().unwrap();
// Push it to the server. On unauthorized failures, the client will call our
// auth_callback method to refresh the authorization.
patient.create(&client).await?;
Ok(())
}
use fhir_sdk::r5::{
codes::AdministrativeGender,
resources::{IdentifiableResource, Patient},
types::{Identifier, HumanName},
};
#[tokio::main]
async fn main() {
// Create a Patient resource using a builder.
let mut patient = Patient::builder()
.active(false)
.identifier(vec![Some(
Identifier::builder()
.system("MySystem".to_owned())
.value("ID".to_owned())
.build()
.unwrap()
)])
.gender(AdministrativeGender::Male)
.name(vec![Some(HumanName::builder().family("Test".to_owned()).build().unwrap())])
.build()
.unwrap();
// Check the identifier value.
assert_eq!(patient.identifier_with_system("MySystem").map(String::as_str), Some("ID"));
}
Licensed under the MIT license. All contributors agree to license under this license.