72 lines
1.7 KiB
Python
72 lines
1.7 KiB
Python
|
|
# Copyright (C) 2021 Google LLC
|
||
|
|
#
|
||
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
|
# you may not use this file except in compliance with the License.
|
||
|
|
# You may obtain a copy of the License at
|
||
|
|
#
|
||
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
#
|
||
|
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
|
# See the License for the specific language governing permissions and
|
||
|
|
# limitations under the License.
|
||
|
|
|
||
|
|
from proto.primitives import ProtoType
|
||
|
|
|
||
|
|
|
||
|
|
class StringyNumberRule:
|
||
|
|
"""A marshal between certain numeric types and strings
|
||
|
|
|
||
|
|
This is a necessary hack to allow round trip conversion
|
||
|
|
from messages to dicts back to messages.
|
||
|
|
|
||
|
|
See https://github.com/protocolbuffers/protobuf/issues/2679
|
||
|
|
and
|
||
|
|
https://developers.google.com/protocol-buffers/docs/proto3#json
|
||
|
|
for more details.
|
||
|
|
"""
|
||
|
|
|
||
|
|
def to_python(self, value, *, absent: bool = None):
|
||
|
|
return value
|
||
|
|
|
||
|
|
def to_proto(self, value):
|
||
|
|
if value is not None:
|
||
|
|
return self._python_type(value)
|
||
|
|
|
||
|
|
return None
|
||
|
|
|
||
|
|
|
||
|
|
class Int64Rule(StringyNumberRule):
|
||
|
|
_python_type = int
|
||
|
|
_proto_type = ProtoType.INT64
|
||
|
|
|
||
|
|
|
||
|
|
class UInt64Rule(StringyNumberRule):
|
||
|
|
_python_type = int
|
||
|
|
_proto_type = ProtoType.UINT64
|
||
|
|
|
||
|
|
|
||
|
|
class SInt64Rule(StringyNumberRule):
|
||
|
|
_python_type = int
|
||
|
|
_proto_type = ProtoType.SINT64
|
||
|
|
|
||
|
|
|
||
|
|
class Fixed64Rule(StringyNumberRule):
|
||
|
|
_python_type = int
|
||
|
|
_proto_type = ProtoType.FIXED64
|
||
|
|
|
||
|
|
|
||
|
|
class SFixed64Rule(StringyNumberRule):
|
||
|
|
_python_type = int
|
||
|
|
_proto_type = ProtoType.SFIXED64
|
||
|
|
|
||
|
|
|
||
|
|
STRINGY_NUMBER_RULES = [
|
||
|
|
Int64Rule,
|
||
|
|
UInt64Rule,
|
||
|
|
SInt64Rule,
|
||
|
|
Fixed64Rule,
|
||
|
|
SFixed64Rule,
|
||
|
|
]
|