fhirpathrs 0.1.1

Fhirpath implementation in Rust
Documentation
# fhirpathrs

A [FHIRPath](http://hl7.org/fhirpath/) implementation in Rust.

## Usage

```rust
use fhirpathrs::evaluate::{compile, EvaluateOptions};
use fhirpathrs::models::{get_model_details, ModelType};
use serde_json::json;

fn main() {
    let compiled_path = compile(&"Patient.name[0].given".to_string()).unwrap();

    let patient = json!({
        "resourceType": "Patient",
        "name": [
            {
                "family": "FamilyName",
                "given": "GivenName"
            }
        ]
    });

    let options: EvaluateOptions = EvaluateOptions {
        // select the FHIR context model to use when
        // evaluating resources, allowing fhirpath
        // to extract type information and access
        // choice[x] properties
        model: Some(get_model_details(ModelType::Stu3).unwrap()),
        vars: None,
        now: None,
        trace_function: None
    };

    let result = compiled_path.evaluate(vec![patient], Some(options)).unwrap();

    // [String("GivenName")]
    println!("{:?}", result);
}
```

## Implementation Status

The current intention is to support the [N1 normative release of FHIRPath](https://hl7.org/fhirpath/N1/) and the [R5 specification](https://hl7.org/fhir/R5/fhirpath.html),
however due to the asynchronous nature of the R5 specification this will likely require a large refactor.


| Icon          | Status                           |
|---------------|----------------------------------|
| :x: | Feature has not been implemented |
| :exclamation: | Feature is partially implemented |
|:white_check_mark:| Feature has been implemented     |

### N1 normative Implementation Status

- 5. Functions
  - 5.1. Existence
    - 5.1.1. empty() : Boolean - :white_check_mark:
    - 5.1.2. exists([criteria : expression]) : Boolean - :white_check_mark:
    - 5.1.3. all(criteria : expression) : Boolean - :exclamation:
    - 5.1.4. allTrue() : Boolean - :white_check_mark:
    - 5.1.5. anyTrue() : Boolean - :white_check_mark:
    - 5.1.6. allFalse() : Boolean - :white_check_mark:
    - 5.1.7. anyFalse() : Boolean - :white_check_mark:
    - 5.1.8. subsetOf(other : collection) : Boolean - :white_check_mark:
    - 5.1.9. supersetOf(other : collection) : Boolean - :white_check_mark:
    - 5.1.10. count() : Integer - :white_check_mark:
    - 5.1.11. distinct() : collection - :white_check_mark:
    - 5.1.12. isDistinct() : Boolean - :white_check_mark:
  - 5.2. Filtering and projection
    - 5.2.1. where(criteria : expression) : collection - :white_check_mark:
    - 5.2.2. select(projection: expression) : collection - :white_check_mark:
    - 5.2.3. repeat(projection: expression) : collection - :white_check_mark:
    - 5.2.4. ofType(type : type specifier) : collection - :exclamation:
  - 5.3. Subsetting
    - 5.3.1. [ index : Integer ] : collection - :white_check_mark:
    - 5.3.2. single() : collection - :white_check_mark:
    - 5.3.3. first() : collection - :white_check_mark:
    - 5.3.4. last() : collection - :white_check_mark:
    - 5.3.5. tail() : collection - :white_check_mark:
    - 5.3.6. skip(num : Integer) : collection - :white_check_mark:
    - 5.3.7. take(num : Integer) : collection - :white_check_mark:
    - 5.3.8. intersect(other: collection) : collection - :white_check_mark:
    - 5.3.9. exclude(other: collection) : collection - :white_check_mark:
  - 5.4. Combining
    - 5.4.1. union(other : collection) - :white_check_mark:
    - 5.4.2. combine(other : collection) : collection - :white_check_mark:
  - 5.5. Conversion
    - 5.5.1. iif(criterion: expression, true-result: collection [, otherwise-result: collection]) : collection - :white_check_mark:
    - 5.5.2. Boolean Conversion Functions
      - toBoolean() : Boolean - :white_check_mark:
      - convertsToBoolean() : Boolean - :white_check_mark:
    - 5.5.3. Integer Conversion Functions
      - toInteger() : Integer - :white_check_mark:
      - convertsToInteger() : Boolean - :white_check_mark:
    - 5.5.4. Date Conversion Functions
      - toDate() : Date - :white_check_mark:
      - convertsToDate() : Boolean - :white_check_mark:
    - 5.5.5. DateTime Conversion Functions
      - toDateTime() : DateTime - :white_check_mark:
      - convertsToDateTime() : Boolean - :white_check_mark:
    - 5.5.6. Decimal Conversion Functions
      - toDecimal() : Decimal - :white_check_mark:
      - convertsToDecimal() : Boolean - :white_check_mark:
    - 5.5.7. Quantity Conversion Functions
      - toQuantity([unit : String]) : Quantity - :x:
      - convertsToQuantity([unit : String]) : Boolean - :x:
    - 5.5.8. String Conversion Functions
      - toString() : String - :white_check_mark:
      - convertsToString() : String - :white_check_mark:
    - 5.5.9. Time Conversion Functions
      - toTime() : Time - :white_check_mark:
      - convertsToTime() : Boolean - :white_check_mark:
  - 5.6. String Manipulation
    - 5.6.1. indexOf(substring : String) : Integer - :white_check_mark:
    - 5.6.2. substring(start : Integer [, length : Integer]) : String - :white_check_mark:
    - 5.6.3. startsWith(prefix : String) : Boolean - :white_check_mark:
    - 5.6.4. endsWith(suffix : String) : Boolean - :white_check_mark:
    - 5.6.5. contains(substring : String) : Boolean - :white_check_mark:
    - 5.6.6. upper() : String - :white_check_mark:
    - 5.6.7. lower() : String - :white_check_mark:
    - 5.6.8. replace(pattern : String, substitution : String) : String - :white_check_mark:
    - 5.6.9. matches(regex : String) : Boolean - :white_check_mark:
    - 5.6.10. replaceMatches(regex : String, substitution: String) : String - :white_check_mark:
    - 5.6.11. length() : Integer - :white_check_mark:
    - 5.6.12. toChars() : collection - :white_check_mark:
  - 5.7. Math
    - 5.7.1. abs() : Integer | Decimal | Quantity - :white_check_mark:
    - 5.7.2. ceiling() : Integer - :white_check_mark:
    - 5.7.3. exp() : Decimal - :white_check_mark:
    - 5.7.4. floor() : Integer - :white_check_mark:
    - 5.7.5. ln() : Decimal - :white_check_mark:
    - 5.7.6. log(base : Decimal) : Decimal - :white_check_mark:
    - 5.7.7. power(exponent : Integer | Decimal) : Integer | Decimal - :exclamation: - complex numbers need checking correctly
    - 5.7.8. round([precision : Integer]) : Decimal - :white_check_mark:
    - 5.7.9. sqrt() : Decimal - :white_check_mark:
    - 5.7.10. truncate() : Integer - :white_check_mark:
  - 5.8. Tree navigation
    - 5.8.1. children() : collection - :exclamation:
    - 5.8.2. descendants() : collection - :exclamation:
  - 5.9. Utility functions
    - 5.9.1. trace(name : String [, projection: Expression]) : collection - :white_check_mark:
    - 5.9.2. Current date and time functions
      - now() : DateTime - :white_check_mark:
      - timeOfDay() : Time - :exclamation:
      - today() : Date - :white_check_mark:
- 6. Operations
  - 6.1. Equality
    - 6.1.1. = (Equals) - :exclamation:
    - 6.1.2. ~ (Equivalent) - :exclamation:
    - 6.1.3. != (Not Equals) - :exclamation:
    - 6.1.4. !~ (Not Equivalent) - :exclamation:
  - 6.2. Comparison
    - 6.2.1. > (Greater Than) - :exclamation:
    - 6.2.2. < (Less Than) - :exclamation:
    - 6.2.3. <= (Less or Equal) - :exclamation:
    - 6.2.4. >= (Greater or Equal) - :exclamation:
  - 6.3. Types
    - 6.3.1. is type specifier
    - 6.3.2. is(type : type specifier)
    - 6.3.3. as type specifier
    - 6.3.4. as(type : type specifier)
  - 6.4. Collections
    - 6.4.1. | (union collections)
    - 6.4.2. in (membership)
    - 6.4.3. contains (containership)
  - 6.5. Boolean logic
    - 6.5.1. and
    - 6.5.2. or
    - 6.5.3. not() : Boolean
    - 6.5.4. xor
    - 6.5.5. implies
  - 6.6. Math
    - 6.6.1. * (multiplication)
    - 6.6.2. / (division)
    - 6.6.3. + (addition)
    - 6.6.4. - (subtraction)
    - 6.6.5. div
    - 6.6.6. mod
    - 6.6.7. & (String concatenation)
  - 6.7. Date/Time Arithmetic
    - 6.7.1. + (addition)
    - 6.7.2. - (subtraction)
- 7. Aggregates
  - 7.1. aggregate(aggregator : expression [, init : value]) : value - :white_check_mark:
- 8. Lexical Elements
  - 8.1. Whitespace
  - 8.2. Comments
- 9. Environment variables
- 10. Types and Reflection
  - 10.2. Reflection
    - 10.2.1. Primitive Types
    - 10.2.2. Class Types
    - 10.2.3. Collection Types
    - 10.2.4. Anonymous Types