Skip to main content

Core SDK Overview

The Ignixa Core SDK is a collection of high-performance, reusable .NET libraries for building FHIR applications. These packages can be used independently of the Ignixa FHIR Server.

Package Overview​

┌─────────────────────────────────────────────────────────────────────────┐
│ Feature Packages │
├─────────────────────────────────────────────────────────────────────────┤
│ Search Validation FhirFakes NarrativeGenerator SqlOnFhir │
│ FhirMappingLanguage PackageManagement Extensions.FirelySdk6│
└──────┬─────────┬──────────────┬─────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────────────────────────────────────────┐
│ Core Packages │
├──────────────┬──────────────────────────┬───────────────────────────────┤
│ Specification│ Serialization │ FhirPath │
│ (metadata) │ (JSON) │ (expressions) │
└──────┬───────┴────────────┬─────────────┴──────────────┬────────────────┘
│ │ │
└────────────────────┼────────────────────────────┘
▼
┌────────────────────────────┐
│ Ignixa.Abstractions │
│ (IElement, ISourceNode) │
└────────────────────────────┘

Dependency Relationships (from .csproj files):

PackageDepends On
Abstractions(foundation - no internal deps)
Analyzers(Roslyn analyzer - no runtime deps)
SerializationAbstractions, Analyzers
Models.R4 / Models.R5Serialization, Abstractions
FhirPathAbstractions
SpecificationSerialization, Abstractions
SearchFhirPath, Specification, Serialization
ValidationFhirPath, Specification, Serialization
FhirFakesSpecification, Serialization
NarrativeGeneratorAbstractions, FhirPath, Serialization
SqlOnFhirAbstractions, FhirPath, Serialization
FhirMappingLanguageAbstractions, FhirPath, Serialization
PackageManagementAbstractions
Extensions.FirelySdk6Abstractions, Serialization

Available Packages​

Foundation​

PackageDescription
Ignixa.AbstractionsCore interfaces (IElement, ISourceNavigator, IType)
Ignixa.SpecificationFHIR structure definitions for STU3/R4/R4B/R5/R6

Data Processing​

PackageDescription
Ignixa.SerializationHigh-performance JSON serialization, plus the shared base layer for typed models
Ignixa.Models.R4Opt-in strongly-typed POCO facades for FHIR R4, zero-copy over the Serialization runtime
Ignixa.Models.R5Opt-in strongly-typed POCO facades for FHIR R5, zero-copy over the Serialization runtime
Ignixa.SearchSearch parameter definitions and indexing
Ignixa.ValidationSchema-based validation engine

Advanced Features​

PackageDescription
Ignixa.FhirPathCompiled FHIRPath expression engine
Ignixa.FhirMappingLanguageFHIR Mapping Language (FML) evaluator
Ignixa.NarrativeGeneratorFHIR narrative generation (HTML, Markdown, Compact)
Ignixa.SqlOnFhirSQL on FHIR v2 ViewDefinition evaluator
Ignixa.DeIdFHIR resource de-identification via FHIRPath rules (HIPAA Safe Harbor)
Ignixa.PackageManagementFHIR package loading from NPM registry

Testing & Development​

PackageDescription
Ignixa.AnalyzersRoslyn analyzers for compile-time protection against common misuse patterns
Ignixa.FhirFakesSynthetic FHIR data generator with clinical scenarios

Interoperability​

PackageDescription
Ignixa.Extensions.FirelySdk6Bidirectional Firely SDK 6.x integration

Quick Start​

# Core packages
dotnet add package Ignixa.Abstractions
dotnet add package Ignixa.Serialization
dotnet add package Ignixa.Specification

# Typed models (opt-in, pick the version(s) you need; Beta, requires --prerelease)
dotnet add package Ignixa.Models.R4 --prerelease
dotnet add package Ignixa.Models.R5 --prerelease

# FHIRPath evaluation
dotnet add package Ignixa.FhirPath

# Validation
dotnet add package Ignixa.Validation

# Test data generation
dotnet add package Ignixa.FhirFakes

Basic Usage​

Parse FHIR JSON​

using Ignixa.Serialization;
using Ignixa.Specification;

var json = """
{
"resourceType": "Patient",
"id": "123",
"name": [{ "family": "Smith", "given": ["John"] }]
}
""";

// Parse to ISourceNavigator
var sourceNode = JsonSourceNodeFactory.Parse(json);

// Navigate the structure
var resourceType = sourceNode.ResourceType; // "Patient"
var id = sourceNode["id"].Text; // "123"
var familyName = sourceNode["name"][0]["family"].Text; // "Smith"

Use Typed Models (opt-in)​

using Ignixa.Models.R4;
using Ignixa.Serialization;
using Ignixa.Serialization.SourceNodes;

// Same zero-copy JSON underneath -- typed accessors instead of string navigation.
Patient patient = ResourceJsonNode.Parse(json).As<Patient>();
var familyName = patient.Name[0].Family; // "Smith", compile-time checked

See Typed Models for cross-version usage and the As<T>() safety guard.

Evaluate FHIRPath​

using Ignixa.FhirPath.Evaluation;
using Ignixa.Specification;

var schemaProvider = FhirVersion.R4.GetSchemaProvider();
var element = sourceNode.ToElement(schemaProvider);

// Simple path
var names = element.Select("name.given");

// Boolean check
var isActive = element.IsTrue("active = true");

// Scalar value as its FhirPath string representation
var birthDate = element.Select("birthDate").AsString();

Validate Resources​

using Ignixa.Validation;
using Ignixa.Validation.Schema;

var schemaProvider = FhirVersion.R4.GetSchemaProvider();
var schemaResolver = new StructureDefinitionSchemaResolver(schemaProvider);
var cachedResolver = new CachedValidationSchemaResolver(schemaResolver);

// Get validation schema
var schema = cachedResolver.GetSchema("Patient");

// Validate
var element = sourceNode.ToElement(schemaProvider);
var settings = new ValidationSettings { Depth = ValidationDepth.Spec };
var result = schema.Validate(element, settings);

if (!result.IsValid)
{
foreach (var issue in result.Issues)
{
Console.WriteLine($"{issue.Severity}: {issue.Message}");
}
}

Generate Test Data​

using Ignixa.FhirFakes.Scenarios;
using Ignixa.FhirFakes.Scenarios.Predefined;
using Ignixa.Specification;

var schemaProvider = FhirVersion.R4.GetSchemaProvider();

// Use predefined clinical scenarios
var diabeticPatient = schemaProvider.GetDiabeticPatient(age: 52);
var bundle = diabeticPatient.ToBundle();

// Or build custom scenarios
var scenario = new ScenarioBuilder(schemaProvider)
.WithPatient(p => p.WithAge(35).WithGender(g => g.Female))
.AddEncounter("Annual checkup")
.AddComprehensiveMetabolicPanel()
.Build();

Key Design Principles​

1. ISourceNavigator Abstraction​

All packages work with ISourceNavigator, a lightweight abstraction over FHIR JSON:

public interface ISourceNavigator
{
string Name { get; }
string Text { get; }
string Location { get; }
string ResourceType { get; }
IEnumerable<ISourceNavigator> Children(string? name = null);
}

2. IElement for Typed Operations​

Convert to IElement for FHIRPath evaluation and validation:

var element = sourceNode.ToElement(schemaProvider);

// IElement has type information
var instanceType = element.InstanceType; // "Patient"
var typeInfo = element.Type; // Type metadata

3. Compiled Expressions​

FHIRPath expressions are automatically parsed, compiled, and cached:

// First call: parse + compile + cache
var result = element.Select("name.given.first()");

// Subsequent calls: uses cached compiled delegate
var result2 = element.Select("name.given.first()");

FHIR Version Support​

PackageSTU3R4R4BR5R6
Abstractions✅✅✅✅✅
Specification✅✅✅✅✅
Serialization✅✅✅✅✅
FhirPath✅✅✅✅✅
Validation✅✅✅✅✅
Search✅✅✅✅✅
Models.R4✅
Models.R5✅

Typed models are version-specific by design (one package per FHIR version), unlike the version-agnostic core packages above -- see Typed Models for details.