def add_message_to_extension(msg: message.Message, extension: message.Message) -> None: """Adds the contents of msg to extension. Args: msg: A FHIR profile of Extension, whose contents should be added to the generic extension. extension: The generic Extension to populate. """ if not fhir_types.is_profile_of_extension(msg): raise ValueError(f'Message: {msg.DESCRIPTOR.full_name} is not a valid ' 'FHIR Extension profile.') if not fhir_types.is_extension(extension): raise ValueError( f'Extension: {extension.DESCRIPTOR.full_name} is not a ' 'valid FHIR Extension.') cast(Any, extension).url.value = annotation_utils.get_structure_definition_url( msg.DESCRIPTOR) # Copy over the id field if present if proto_utils.field_is_set(msg, 'id'): proto_utils.copy_common_field(msg, extension, 'id') # Copy the vlaue fields from message into the extension value_fields = [ field for field in msg.DESCRIPTOR.fields if field.name not in NON_VALUE_FIELDS ] if not value_fields: raise ValueError( f'Extension has no value fields: {msg.DESCRIPTOR.name}.') # Add fields to the extension. If there is a single value field, a simple # value assignment will suffice. Otherwise, we need to loop over all fields # and add them as child extensions if (len(value_fields) == 1 and not proto_utils.field_is_repeated(value_fields[0])): value_field = value_fields[0] _verify_field_is_proto_message_type(value_field) if proto_utils.field_is_set(msg, value_field): value = proto_utils.get_value_at_field(msg, value_field) _add_value_to_extension( value, extension, annotation_utils.is_choice_type_field(value_field)) else: # TODO: Invalid FHIR; throw an error here? pass else: # Add child extensions... _add_fields_to_extension(msg, extension)
def _print(self, msg: message.Message): """Prints the JSON representation of message to the underlying generator.""" # TODO: Identify ContainedResource with an annotation if msg.DESCRIPTOR.name == 'ContainedResource': self._print_contained_resource(msg) elif msg.DESCRIPTOR.full_name == any_pb2.Any.DESCRIPTOR.full_name: contained_resource = self.primitive_handler.new_contained_resource( ) cast(any_pb2.Any, msg).Unpack(contained_resource) self._print_contained_resource(contained_resource) elif fhir_types.is_extension(msg): self._print_extension(msg) elif annotation_utils.is_reference(msg): self._print_reference(msg) else: self._print_message(msg)
def _print(self, msg: message.Message) -> None: """Prints the JSON representation of message to the underlying generator.""" # TODO: Identify ContainedResource with an annotation if msg.DESCRIPTOR.name == 'ContainedResource': self._print_contained_resource(msg) elif msg.DESCRIPTOR.full_name == any_pb2.Any.DESCRIPTOR.full_name: contained_resource = self.primitive_handler.new_contained_resource( ) if not cast(any_pb2.Any, msg).Unpack(contained_resource): # If we can't unpack the Any, drop it. # TODO: Use a registry to determine the correct # ContainedResource to unpack to return self._print_contained_resource(contained_resource) elif fhir_types.is_extension(msg): self._print_extension(msg) elif annotation_utils.is_reference(msg): self._print_reference(msg) else: self._print_message(msg)
def testIsExtension_withDateTime_returnsFalse(self): """Tests that is_extension returns False when given a DateTime.""" self.assertFalse(fhir_types.is_extension(datatypes_pb2.DateTime()))
def testIsExtension_withExtension_returnsTrue(self): """Tests that is_extension returns True when given an Extension.""" self.assertTrue(fhir_types.is_extension(datatypes_pb2.Extension()))