/// <summary>Resolve a <see cref="StructureDefinition"/> from a TypeRef.Code element, handle unknown/custom core types.</summary> /// <param name="resolver">An <see cref="IArtifactSource"/> reference.</param> /// <param name="typeCodeElement">A <see cref="ElementDefinition.TypeRefComponent.CodeElement"/> reference.</param> /// <returns>A <see cref="StructureDefinition"/> instance, or <c>null</c>.</returns> internal static StructureDefinition GetStructureDefinitionForTypeCode(this IResourceResolver resolver, Code <FHIRDefinedType> typeCodeElement) { StructureDefinition sd = null; var typeCode = typeCodeElement.Value; if (typeCode.HasValue) { sd = resolver.FindStructureDefinitionForCoreType(typeCode.Value); } else { // Unknown/custom core type; try to resolve from raw object value var typeName = typeCodeElement.ObjectValue as string; if (!string.IsNullOrEmpty(typeName)) { sd = resolver.FindStructureDefinitionForCoreType(typeName); } } return(sd); }
public void InitializationAndResolution() { var sd = _resolver.FindStructureDefinitionForCoreType(FHIRDefinedType.ValueSet); var assertion = new ProfileAssertion("Patient.name[0]", resolve); assertion.SetInstanceType(FHIRDefinedType.ValueSet); assertion.SetDeclaredType(FHIRDefinedType.ValueSet); assertion.AddStatedProfile("http://hl7.org/fhir/StructureDefinition/shareablevalueset"); Assert.Equal(2, assertion.AllProfiles.Count()); Assert.Equal(2, assertion.AllProfiles.Count(p => p.Status == null)); // status == null is only true for unresolved resources assertion.AddStatedProfile(sd); Assert.Equal(2, assertion.AllProfiles.Count()); // Adding a ValueSet SD that was already there does not increase the profile count Assert.Equal(1, assertion.AllProfiles.Count(p => p.Status == null)); // but now there's 1 unresolved profile less Assert.True(assertion.AllProfiles.Contains(sd)); // the other being the Sd we just added Assert.Equal(sd, assertion.InstanceType); Assert.Equal(sd, assertion.DeclaredType); var outcome = assertion.Resolve(); Assert.True(outcome.Success); Assert.Equal(2, assertion.AllProfiles.Count()); // We should still have 2 distinct SDs Assert.Equal(0, assertion.AllProfiles.Count(p => p.Status == null)); // none remain unresolved Assert.True(assertion.AllProfiles.Contains(sd)); // one still being the Sd we manually added assertion.AddStatedProfile("http://hl7.org/fhir/StructureDefinition/unresolvable"); outcome = assertion.Resolve(); Assert.False(outcome.Success); Assert.Equal(3, assertion.AllProfiles.Count()); // We should still have 3 distinct SDs Assert.Equal(1, assertion.AllProfiles.Count(p => p.Status == null)); // one remains unresolved Assert.True(assertion.AllProfiles.Contains(sd)); // one still being the Sd we manually added }
public static StructureDefinition FindStructureDefinitionForCoreType(this IResourceResolver resolver, FHIRDefinedType type) { return(resolver.FindStructureDefinitionForCoreType(ModelInfo.FhirTypeToFhirTypeName(type))); }