public OperationOutcome ValidateBinding(IElementNavigator instance, ElementDefinition definition) { var outcome = new OperationOutcome(); if (definition.Binding != null) { var binding = definition.Binding; if (binding.ValueSet != null) { var uri = (binding.ValueSet as FhirUri)?.Value; // == null, so we check whether this could NOT be casted to a FhirUri, thus is a ValueSet reference if (uri == null) { uri = (binding.ValueSet as ResourceReference).Reference; var codedType = Validator.DetermineType(definition, instance); if (codedType != null) { if (codedType.Value.IsBindeableFhirType()) { var bindable = instance.ParseBindable(codedType.Value); if (bindable is Coding) { return(ValidateBinding(bindable as Coding, uri, binding.Strength)); } else { return(ValidateBinding(bindable as CodeableConcept, uri, binding.Strength)); } } else { outcome.AddIssue($"A binding is given ('{uri}'), but the instance data is of type '{codedType.Value}', which is not bindeable.", Issue.CONTENT_TYPE_NOT_BINDEABLE, instance); } } else { outcome.AddIssue($"Cannot determine type of data in instance to extract code/system information", Issue.CONTENT_ELEMENT_CANNOT_DETERMINE_TYPE, instance); } } else { outcome.AddIssue($"Binding element references a valueset by uri ({uri}), which cannot be used to validate a binding", Issue.UNSUPPORTED_URI_BINDING_NOT_SUPPORTED, instance); } } else { outcome.AddIssue($"Encountered a binding element without a ValueSet reference", Issue.PROFILE_BINDING_WITHOUT_VALUESET, instance); } } return(outcome); }