Esempio n. 1
0
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)
Esempio n. 2
0
 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)
Esempio n. 3
0
 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)
Esempio n. 4
0
 def testIsExtension_withDateTime_returnsFalse(self):
     """Tests that is_extension returns False when given a DateTime."""
     self.assertFalse(fhir_types.is_extension(datatypes_pb2.DateTime()))
Esempio n. 5
0
 def testIsExtension_withExtension_returnsTrue(self):
     """Tests that is_extension returns True when given an Extension."""
     self.assertTrue(fhir_types.is_extension(datatypes_pb2.Extension()))