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
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}')
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()))