示例#1
0
 def get_primitive_wrapper_cls_for_primitive_cls(
     self, primitive_cls: Type[message.Message]
 ) -> Type[_primitive_wrappers.PrimitiveWrapper]:
     if fhir_types.is_type_or_profile_of_code(primitive_cls.DESCRIPTOR):
         return _primitive_wrappers.CodeWrapper
     elif proto_utils.are_same_message_type(
             primitive_cls.DESCRIPTOR, self.base64_binary_cls.DESCRIPTOR):
         return _base64_binary.Base64BinaryWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.boolean_cls.DESCRIPTOR):
         return _primitive_wrappers.BooleanWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.date_cls.DESCRIPTOR):
         return _date.DateWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.date_time_cls.DESCRIPTOR):
         return _date_time.DateTimeWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.decimal_cls.DESCRIPTOR):
         return _decimal.DecimalWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.id_cls.DESCRIPTOR):
         return _primitive_wrappers.StringLikePrimitiveWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.instant_cls.DESCRIPTOR):
         return _instant.InstantWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.integer_cls.DESCRIPTOR):
         return _primitive_wrappers.IntegerLikePrimitiveWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.markdown_cls.DESCRIPTOR):
         return _primitive_wrappers.StringLikePrimitiveWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.oid_cls.DESCRIPTOR):
         return _primitive_wrappers.StringLikePrimitiveWrapper
     elif proto_utils.are_same_message_type(
             primitive_cls.DESCRIPTOR, self.positive_int_cls.DESCRIPTOR):
         return _primitive_wrappers.IntegerLikePrimitiveWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.string_cls.DESCRIPTOR):
         return _primitive_wrappers.StringLikePrimitiveWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.time_cls.DESCRIPTOR):
         return _time.TimeWrapper
     elif proto_utils.are_same_message_type(
             primitive_cls.DESCRIPTOR, self.unsigned_int_cls.DESCRIPTOR):
         return _primitive_wrappers.IntegerLikePrimitiveWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.uri_cls.DESCRIPTOR):
         return _primitive_wrappers.StringLikePrimitiveWrapper
     elif proto_utils.are_same_message_type(primitive_cls.DESCRIPTOR,
                                            self.xhtml_cls.DESCRIPTOR):
         return _primitive_wrappers.XhtmlWrapper
     raise ValueError(
         'Unexpected STU3 FHIR primitive: '
         f'{primitive_cls.DESCRIPTOR.full_name!r} for handler: {type(self)}.'
     )
  def get_primitive_wrapper_cls_for_primitive_cls(
      self, primitive_cls: Type[message.Message]
  ) -> Type[_primitive_wrappers.PrimitiveWrapper]:
    if fhir_types.is_type_or_profile_of_code(primitive_cls.DESCRIPTOR):
      return _primitive_wrappers.CodeWrapper

    primitive_wrapper_cls = self._DESC_TO_PRIMITIVE_WRAPPER_TYPE.get(
        primitive_cls.DESCRIPTOR.full_name)
    if primitive_wrapper_cls is None:
      raise ValueError(
          'Unexpected STU3 FHIR primitive: '
          f'{primitive_cls.DESCRIPTOR.full_name!r} for handler: {type(self)}.')
    return primitive_wrapper_cls
示例#3
0
def get_code_as_string(code: message.Message) -> str:
    """Returns the string representation of a FHIR code."""
    if not fhir_types.is_type_or_profile_of_code(code):
        raise ValueError(
            f'Invalid type for get_code_as_string: {code.DESCRIPTOR.full_name}'
        )

    value_field = code.DESCRIPTOR.fields_by_name.get('value')
    if value_field is None:
        raise ValueError(
            f'Invalid code type for get_code_as_string: {code.DESCRIPTOR.full_name}'
        )

    value = proto_utils.get_value_at_field(code, value_field)
    if value_field.type == descriptor.FieldDescriptor.TYPE_STRING:
        return value
    elif value_field.type == descriptor.FieldDescriptor.TYPE_ENUM:
        return enum_value_descriptor_to_code_string(
            value_field.enum_type.values_by_number[value])
    else:
        raise fhir_errors.InvalidFhirError(
            f'Invalid value field type: {value_field.type!r} for code: '
            f'{code.DESCRIPTOR.full_name}')
示例#4
0
def copy_code(source: message.Message, target: message.Message):
    """Adds all fields from source to target.

  Args:
    source: The FHIR Code instance to copy from.
    target: The target FHIR Code instance to copy to.
  """
    if not fhir_types.is_type_or_profile_of_code(source.DESCRIPTOR):
        raise fhir_errors.InvalidFhirError(
            f'Source: {source.DESCRIPTOR.full_name} '
            'is not type or profile of Code.')

    if not fhir_types.is_type_or_profile_of_code(target.DESCRIPTOR):
        raise fhir_errors.InvalidFhirError(
            f'Target: {target.DESCRIPTOR.full_name} '
            'is not type or profile of Code.')

    if proto_utils.are_same_message_type(source.DESCRIPTOR, target.DESCRIPTOR):
        target.CopyFrom(source)
        return

    source_value_field = source.DESCRIPTOR.fields_by_name.get('value')
    target_value_field = target.DESCRIPTOR.fields_by_name.get('value')
    if source_value_field is None or target_value_field is None:
        raise fhir_errors.InvalidFhirError(
            'Unable to copy code from '
            f'{source.DESCRIPTOR.full_name} '
            f'to {target.DESCRIPTOR.full_name}.')

    proto_utils.copy_common_field(source, target, 'id')
    proto_utils.copy_common_field(source, target, 'extension')

    # Handle specialized codes
    if (source_value_field.type not in _CODE_TYPES
            or target_value_field.type not in _CODE_TYPES):
        raise ValueError(
            f'Unable to copy from {source.DESCRIPTOR.full_name} '
            f'to {target.DESCRIPTOR.full_name}. Must have a field '
            'of TYPE_ENUM or TYPE_STRING.')

    source_value = proto_utils.get_value_at_field(source, source_value_field)
    if source_value_field.type == target_value_field.type:
        # Perform a simple assignment if value_field types are equivalent
        proto_utils.set_value_at_field(target, target_value_field,
                                       source_value)
    else:
        # Otherwise, we need to transform the value prior to assignment...
        if source_value_field.type == descriptor.FieldDescriptor.TYPE_STRING:
            source_enum_value = code_string_to_enum_value_descriptor(
                source_value, target_value_field.enum_type)
            proto_utils.set_value_at_field(target, target_value_field,
                                           source_enum_value.number)
        elif source_value_field.type == descriptor.FieldDescriptor.TYPE_ENUM:
            source_string_value = enum_value_descriptor_to_code_string(
                source_value_field.enum_type.values_by_number[source_value])
            proto_utils.set_value_at_field(target, target_value_field,
                                           source_string_value)
        else:  # Should never hit
            raise ValueError('Unexpected generic value field type: '
                             f'{source_value_field.type}. Must be a field of '
                             'TYPE_ENUM or TYPE_STRING in order to copy.')
 def testIsTypeOrProfileOfCode_withNonCode_returnsFalse(self):
     """Tests that is_type_or_profile_of_code returns False for a non-Code."""
     self.assertFalse(
         fhir_types.is_type_or_profile_of_code(patient_pb2.Patient()))
 def testIsTypeOrProfileOfCode_withCode_returnsTrue(self):
     """Tests that is_type_or_profile_of_code returns True for a base Code."""
     self.assertTrue(
         fhir_types.is_type_or_profile_of_code(datatypes_pb2.Code()))