azure_functions_worker/bindings/nullable_converters.py (57 lines of code) (raw):

from datetime import datetime from typing import Optional, Union from google.protobuf.timestamp_pb2 import Timestamp from azure_functions_worker import protos def to_nullable_string(nullable: Optional[str], property_name: str) -> \ Optional[protos.NullableString]: """Converts string input to an 'NullableString' to be sent through the RPC layer. Input that is not a string but is also not null or undefined logs a function app level warning. :param nullable Input to be converted to an NullableString if it is a valid string :param property_name The name of the property that the caller will assign the output to. Used for debugging. """ if isinstance(nullable, str): return protos.NullableString(value=nullable) if nullable is not None: raise TypeError( f"A 'str' type was expected instead of a '{type(nullable)}' " f"type. Cannot parse value {nullable} of '{property_name}'.") return None def to_nullable_bool(nullable: Optional[bool], property_name: str) -> \ Optional[protos.NullableBool]: """Converts boolean input to an 'NullableBool' to be sent through the RPC layer. Input that is not a boolean but is also not null or undefined logs a function app level warning. :param nullable Input to be converted to an NullableBool if it is a valid boolean :param property_name The name of the property that the caller will assign the output to. Used for debugging. """ if isinstance(nullable, bool): return protos.NullableBool(value=nullable) if nullable is not None: raise TypeError( f"A 'bool' type was expected instead of a '{type(nullable)}' " f"type. Cannot parse value {nullable} of '{property_name}'.") return None def to_nullable_double(nullable: Optional[Union[str, int, float]], property_name: str) -> \ Optional[protos.NullableDouble]: """Converts int or float or str that parses to a number to an 'NullableDouble' to be sent through the RPC layer. Input that is not a valid number but is also not null or undefined logs a function app level warning. :param nullable Input to be converted to an NullableDouble if it is a valid number :param property_name The name of the property that the caller will assign the output to. Used for debugging. """ if isinstance(nullable, int) or isinstance(nullable, float): return protos.NullableDouble(value=nullable) elif isinstance(nullable, str): if len(nullable) == 0: return None try: return protos.NullableDouble(value=float(nullable)) except Exception: raise TypeError( f"Cannot parse value {nullable} of '{property_name}' to " f"float.") if nullable is not None: raise TypeError( f"A 'int' or 'float'" f" type was expected instead of a '{type(nullable)}' " f"type. Cannot parse value {nullable} of '{property_name}'.") return None def to_nullable_timestamp(date_time: Optional[Union[datetime, int]], property_name: str) -> protos.NullableTimestamp: """Converts Date or number input to an 'NullableTimestamp' to be sent through the RPC layer. Input that is not a Date or number but is also not null or undefined logs a function app level warning. :param date_time Input to be converted to an NullableTimestamp if it is valid input :param property_name The name of the property that the caller will assign the output to. Used for debugging. """ if date_time is not None: try: time_in_seconds = date_time if isinstance(date_time, int) else \ date_time.timestamp() return protos.NullableTimestamp( value=Timestamp(seconds=int(time_in_seconds))) except Exception: raise TypeError( f"A 'datetime' or 'int'" f" type was expected instead of a '{type(date_time)}' " f"type. Cannot parse value {date_time} of '{property_name}'.") return None