1# Copyright (C) 2021  Google LLC 
    2# 
    3# Licensed under the Apache License, Version 2.0 (the "License"); 
    4# you may not use this file except in compliance with the License. 
    5# You may obtain a copy of the License at 
    6# 
    7#     http://www.apache.org/licenses/LICENSE-2.0 
    8# 
    9# Unless required by applicable law or agreed to in writing, software 
    10# distributed under the License is distributed on an "AS IS" BASIS, 
    11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    12# See the License for the specific language governing permissions and 
    13# limitations under the License. 
    14 
    15from proto.primitives import ProtoType 
    16 
    17 
    18class StringyNumberRule: 
    19    """A marshal between certain numeric types and strings 
    20 
    21    This is a necessary hack to allow round trip conversion 
    22    from messages to dicts back to messages. 
    23 
    24    See https://github.com/protocolbuffers/protobuf/issues/2679 
    25    and 
    26    https://developers.google.com/protocol-buffers/docs/proto3#json 
    27    for more details. 
    28    """ 
    29 
    30    def to_python(self, value, *, absent: bool = None): 
    31        return value 
    32 
    33    def to_proto(self, value): 
    34        if value is not None: 
    35            return self._python_type(value) 
    36 
    37        return None 
    38 
    39 
    40class Int64Rule(StringyNumberRule): 
    41    _python_type = int 
    42    _proto_type = ProtoType.INT64 
    43 
    44 
    45class UInt64Rule(StringyNumberRule): 
    46    _python_type = int 
    47    _proto_type = ProtoType.UINT64 
    48 
    49 
    50class SInt64Rule(StringyNumberRule): 
    51    _python_type = int 
    52    _proto_type = ProtoType.SINT64 
    53 
    54 
    55class Fixed64Rule(StringyNumberRule): 
    56    _python_type = int 
    57    _proto_type = ProtoType.FIXED64 
    58 
    59 
    60class SFixed64Rule(StringyNumberRule): 
    61    _python_type = int 
    62    _proto_type = ProtoType.SFIXED64 
    63 
    64 
    65STRINGY_NUMBER_RULES = [ 
    66    Int64Rule, 
    67    UInt64Rule, 
    68    SInt64Rule, 
    69    Fixed64Rule, 
    70    SFixed64Rule, 
    71]