Example #1
0
        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);
        }