Skip to content

Commit

Permalink
Add STU-3 models
Browse files Browse the repository at this point in the history
- Include models for FHIR v 3.0.1 in a new `ModelsSTU3` target
- Add simple smoke decode & encode test for all releases
- Add more sample code to the README
  • Loading branch information
p2-apple committed Jul 24, 2020
1 parent 31dc40c commit 97bd420
Show file tree
Hide file tree
Showing 426 changed files with 92,976 additions and 6 deletions.
12 changes: 10 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,25 @@ let package = Package(
],
products: [
.library(name: "ModelsDSTU2", targets: ["ModelsDSTU2"]),
.library(name: "ModelsSTU3", targets: ["ModelsSTU3"]),
.library(name: "ModelsR4", targets: ["ModelsR4"]),
.library(name: "ModelsBuild", targets: ["ModelsBuild"]),
],
targets: [
.target(name: "FMCore"),
.target(name: "ModelsDSTU2", dependencies: ["FMCore"]),
.target(name: "ModelsSTU3", dependencies: ["FMCore"]),
.target(name: "ModelsR4", dependencies: ["FMCore"]),
.target(name: "ModelsBuild", dependencies: ["FMCore"]),
.testTarget(name: "CoreTests", dependencies: ["FMCore"]),
.testTarget(name: "DateTimeTests", dependencies: ["ModelsR4"]),
.testTarget(name: "ModelTests", dependencies: ["ModelsR4"]),
.testTarget(name: "PrimitiveTests", dependencies: ["ModelsR4"]),
.testTarget(name: "ModelTests",
dependencies: [
"ModelsDSTU2",
"ModelsSTU3",
"ModelsR4",
"ModelsBuild",
]),
.testTarget(name: "PrimitiveTests", dependencies: ["ModelsR4"]),
]
)
57 changes: 54 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
FHIRModels
==========

![0.1.0](https://img.shields.io/badge/Latest-0.1.0-blueviolet.svg?style=flat) ![🔥 FHIR DSTU-2, R4, build](https://img.shields.io/badge/🔥_FHIR-DSTU2_•%20R4_•%20β4.4-orange.svg?style=flat) ![Works on macOS, iOS, watchOS and tvOS](https://img.shields.io/badge/Platform-macOS_•%20iOS_•%20watchOS_•%20tvOS-blue.svg?style=flat) [![Swift Package Manager](https://img.shields.io/badge/SPM-compatible-brightgreen.svg?style=flat)][spm] [![License](https://img.shields.io/badge/License-APACHE_2.0-lightgrey.svg?style=flat)](#license)
![0.2.0](https://img.shields.io/badge/Latest-0.2.0-blueviolet.svg?style=flat) ![🔥 FHIR DSTU2, STU3, R4, build](https://img.shields.io/badge/🔥_FHIR-DSTU2_•%20STU3•%20R4_•%20β4.4-orange.svg?style=flat) ![Works on macOS, iOS, watchOS and tvOS](https://img.shields.io/badge/Platform-macOS_•%20iOS_•%20watchOS_•%20tvOS-blue.svg?style=flat) [![Swift Package Manager](https://img.shields.io/badge/SPM-compatible-brightgreen.svg?style=flat)][spm] [![License](https://img.shields.io/badge/License-APACHE_2.0-lightgrey.svg?style=flat)](#license)

FHIRModels is a Swift library for [FHIR®][fhir] resource data models.

## Features

- Native Swift representation of FHIR resources, elements and data types
- Separate targets for DSTU2, R4 and latest build versions
- Separate targets for DSTU2, STU3, R4 and latest build versions
- Enforced non-nullability of mandatory parameters
- Enums for most closed code systems
- Enums to support value[x] types
Expand All @@ -33,7 +33,7 @@ Alternatively, you can add FHIRModels to your `Package.swift` file as a dependen
```swift
dependencies: [
.package(url: "https://github.com/apple/FHIRModels.git",
.upToNextMajor(from: "0.1.0"))
.upToNextMajor(from: "0.2.0"))
]
```

Expand Down Expand Up @@ -94,6 +94,21 @@ do {
}
```

### 3. Get resources from Bundle

To get certain resources from a `Bundle` you can do:

```swift
import ModelsR4

let data = <FHIR JSON data>
let bundle = try JSONDecoder().decode(ModelsR4.Bundle.self, from: data)
let observations = bundle.entry?.compactMap {
$0.resource?.get(if: ModelsR4.Observation.self)
}
// observations is an array of `Observation` instances
```

## Model Properties

FHIR Resource and Element types are represented as Swift classes,
Expand All @@ -117,6 +132,42 @@ name.given?.first?.value // FHIRString?
name.given?.first?.value?.string // String?
```

### Working with primitives

You may be tempted to get the Swift native types from primitive values and pass these around.
To get a String from the resource ID you would do:

```swift
let id = resource.id?.value?.string
```

Instead, consider passing the element around in its full form, in this case as `FHIRPrimitive<FHIRString>`.
This means you will not lose extensions while you can still use some primitives in code as if they were native types.
With `FHIRPrimitive<FHIRString>` for example, you can actually do:

```swift
if resource.id == "101" {

}
```

Conversely, you can also assign many `FHIRPrimitive` types with String, Bool or numeric literals, for example:

```swift
let patient = Patient(...)
patient.id = "101"
patient.active = true
```

Lastly, many Swift native types have been extended to offer an `asFHIR{type}Primitive()` method. URL and String for example offer:

```swift
let url = URL(string: "http://apple.com")!.asFHIRURIPrimitive()
// url is a `FHIRPrimitive<FHIRURI>`
let str = "http://hl7.org/fhir".asFHIRURIPrimitive()
// str is a `FHIRPrimitive<FHIRURI>?`
```

### Date & Time

FHIRModels handles date/time ↔︎ string conversion transparently and will discard invalid dates.
Expand Down
Loading

0 comments on commit 97bd420

Please sign in to comment.