Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: create factory methods for "core" terminology service #2548

Merged
merged 4 commits into from
Jul 24, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@ public LocalTerminologyService(IAsyncResourceResolver resolver, ValueSetExpander
_expander = new ValueSetExpander(settings);
}

/// <summary>
/// Creates a MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets.
/// </summary>
/// <param name="coreResourceResolver">Resource resolves to resolve FHIR core artifacts</param>
/// <param name="expanderSettings">ValueSet expansion settings</param>
/// <returns>A MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets</returns>
public static MultiTerminologyService CreateDefaultForCore(IAsyncResourceResolver coreResourceResolver, ValueSetExpanderSettings? expanderSettings = null)
{
return TerminologyServiceFactory.CreateDefaultForCore(coreResourceResolver, expanderSettings);
}

internal async T.Task<ValueSet?> FindValueset(string canonical)
{
var valueset = await _resolver.FindValueSetAsync(canonical).ConfigureAwait(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#nullable enable

using Hl7.Fhir.Specification.Source;

namespace Hl7.Fhir.Specification.Terminology
{
public static class TerminologyServiceFactory
{
/// <summary>
/// Creates a MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets.
/// </summary>
/// <param name="coreResourceResolver">Resource resolves to resolve FHIR core artifacts</param>
/// <param name="expanderSettings">ValueSet expansion settings</param>
/// <returns>A MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets</returns>
public static MultiTerminologyService CreateDefaultForCore(IAsyncResourceResolver coreResourceResolver, ValueSetExpanderSettings? expanderSettings = null)
{
var mimeTypeRoutingSettings = new TerminologyServiceRoutingSettings(new MimeTypeTerminologyService())
{
PreferredValueSets = new string[]
{
"http://hl7.org/fhir/ValueSet/mimetypes"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should have this as a constant on MimeTypeTerminologyService.

}
};

var localTermRoutingSettings = new TerminologyServiceRoutingSettings(new LocalTerminologyService(coreResourceResolver, expanderSettings))
{
PreferredValueSets = new string[]
{
"http://hl7.org/fhir/ValueSet/"
}
};

return new MultiTerminologyService(mimeTypeRoutingSettings, localTermRoutingSettings);
}

}
}

#nullable restore
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,18 @@ public LocalTerminologyService(IAsyncResourceResolver resolver, ValueSetExpander
_expander = new ValueSetExpander(settings);
}


/// <summary>
/// Creates a MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets.
/// </summary>
/// <param name="coreResourceResolver">Resource resolves to resolve FHIR core artifacts</param>
/// <param name="expanderSettings">ValueSet expansion settings</param>
/// <returns>A MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets</returns>
public static MultiTerminologyService CreateDefaultForCore(IAsyncResourceResolver coreResourceResolver, ValueSetExpanderSettings? expanderSettings = null)
{
return TerminologyServiceFactory.CreateDefaultForCore(coreResourceResolver, expanderSettings);
}

internal async T.Task<ValueSet?> FindValueset(string canonical)
{
var valueset = await _resolver.FindValueSetAsync(canonical).ConfigureAwait(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#nullable enable

using Hl7.Fhir.Specification.Source;

namespace Hl7.Fhir.Specification.Terminology
{
public static class TerminologyServiceFactory
{
/// <summary>
/// Creates a MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets.
/// </summary>
/// <param name="coreResourceResolver">Resource resolves to resolve FHIR core artifacts</param>
/// <param name="expanderSettings">ValueSet expansion settings</param>
/// <returns>A MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets</returns>
public static MultiTerminologyService CreateDefaultForCore(IAsyncResourceResolver coreResourceResolver, ValueSetExpanderSettings? expanderSettings = null)
{
var mimeTypeRoutingSettings = new TerminologyServiceRoutingSettings(new MimeTypeTerminologyService())
{
PreferredValueSets = new string[]
{
"http://www.rfc-editor.org/bcp/bcp13.txt"
}
};

var localTermRoutingSettings = new TerminologyServiceRoutingSettings(new LocalTerminologyService(coreResourceResolver, expanderSettings))
{
PreferredValueSets = new string[]
{
"http://hl7.org/fhir/ValueSet/"
}
};

return new MultiTerminologyService(mimeTypeRoutingSettings, localTermRoutingSettings);
}

}
}

#nullable restore
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,22 @@ public async Task CodingWithValuesetAsSystem(string valueset, string code, strin
result.Parameter.Should().Contain(p => p.Name == "message")
.Subject.Value.Should().BeEquivalentTo(new FhirString($"The Coding references a value set, not a code system ('{system}')"));
}

[TestMethod]
public async Task DefaultCoreServiceTest()
{
var resolver = new CachedResolver(ZipSource.CreateValidationSource());
var service = LocalTerminologyService.CreateDefaultForCore(resolver);

var parameters = new ValidateCodeParameters()
.WithValueSet("http://www.rfc-editor.org/bcp/bcp13.txt")
.WithCode(code: "application/json", context: "context")
.Build();

var result = await service.ValueSetValidateCode(parameters);

result.Parameter.Should().Contain(p => p.Name == "result")
.Subject.Value.Should().BeEquivalentTo(new FhirBoolean(true));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,22 @@ public async Task CodingWithValuesetAsSystem(string valueset, string code, strin
result.Parameter.Should().Contain(p => p.Name == "message")
.Subject.Value.Should().BeEquivalentTo(new FhirString($"The Coding references a value set, not a code system ('{system}')"));
}

[TestMethod]
public async Task DefaultCoreServiceTest()
{
var resolver = new CachedResolver(ZipSource.CreateValidationSource());
var service = LocalTerminologyService.CreateDefaultForCore(resolver);

var parameters = new ValidateCodeParameters()
.WithValueSet("http://hl7.org/fhir/ValueSet/mimetypes")
.WithCode(code: "application/json", context: "context")
.Build();

var result = await service.ValueSetValidateCode(parameters);

result.Parameter.Should().Contain(p => p.Name == "result")
.Subject.Value.Should().BeEquivalentTo(new FhirBoolean(true));
}
}
}