# Path: proto/marshal/rules/message.py
# class MessageRule:
#     """A marshal for converting between a descriptor and proto.Message."""
# 
#     def __init__(self, descriptor: type, wrapper: type):
#         self._descriptor = descriptor
#         self._wrapper = wrapper
# 
#     def to_python(self, value, *, absent: bool = None):
#         if isinstance(value, self._descriptor):
#             return self._wrapper.wrap(value)
#         return value
# 
#     def to_proto(self, value):
#         if isinstance(value, self._wrapper):
#             return self._wrapper.pb(value)
#         if isinstance(value, dict) and not self.is_map:
#             # We need to use the wrapper's marshaling to handle
#             # potentially problematic nested messages.
#             try:
#                 # Try the fast path first.
#                 return self._descriptor(**value)
#             except TypeError as ex:
#                 # If we have a type error,
#                 # try the slow path in case the error
#                 # was an int64/string issue
#                 return self._wrapper(value)._pb
#         return value
# 
#     @property
#     def is_map(self):
#         """Return True if the descriptor is a map entry, False otherwise."""
#         desc = self._descriptor.DESCRIPTOR
#         return desc.has_options and desc.GetOptions().map_entry


import collections
import inspect
import logging
from google.protobuf import descriptor_pb2
from google.protobuf import descriptor_pool
from google.protobuf import message
from google.protobuf import reflection
from proto.marshal.rules.message import MessageRule
#
# 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.




log = logging.getLogger("_FileInfo")


class _FileInfo(
    collections.namedtuple(
        "_FileInfo",
        ["descriptor", "messages", "enums", "name", "nested", "nested_enum"],
    )
):
    registry = {}  # Mapping[str, '_FileInfo']

    @classmethod
    def maybe_add_descriptor(cls, filename, package):
        descriptor = cls.registry.get(filename)
        if not descriptor:
            descriptor = cls.registry[filename] = cls(
                descriptor=descriptor_pb2.FileDescriptorProto(
                    name=filename, package=package, syntax="proto3",
                ),
                enums=collections.OrderedDict(),

# Path: proto/marshal/rules/message.py
# class MessageRule:
#     """A marshal for converting between a descriptor and proto.Message."""
# 
#     def __init__(self, descriptor: type, wrapper: type):
#         self._descriptor = descriptor
#         self._wrapper = wrapper
# 
#     def to_python(self, value, *, absent: bool = None):
#         if isinstance(value, self._descriptor):
#             return self._wrapper.wrap(value)
#         return value
# 
#     def to_proto(self, value):
#         if isinstance(value, self._wrapper):
#             return self._wrapper.pb(value)
#         if isinstance(value, dict) and not self.is_map:
#             # We need to use the wrapper's marshaling to handle
#             # potentially problematic nested messages.
#             try:
#                 # Try the fast path first.
#                 return self._descriptor(**value)
#             except TypeError as ex:
#                 # If we have a type error,
#                 # try the slow path in case the error
#                 # was an int64/string issue
#                 return self._wrapper(value)._pb
#         return value
# 
#     @property
#     def is_map(self):
#         """Return True if the descriptor is a map entry, False otherwise."""
#         desc = self._descriptor.DESCRIPTOR
#         return desc.has_options and desc.GetOptions().map_entry


# Path: proto/_file_info.py
import collections
import inspect
import logging
from google.protobuf import descriptor_pb2
from google.protobuf import descriptor_pool
from google.protobuf import message
from google.protobuf import reflection
from proto.marshal.rules.message import MessageRule

#
# 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.




log = logging.getLogger("_FileInfo")


class _FileInfo(
    collections.namedtuple(
        "_FileInfo",
        ["descriptor", "messages", "enums", "name", "nested", "nested_enum"],
    )
):
    registry = {}  # Mapping[str, '_FileInfo']

    @classmethod
    def maybe_add_descriptor(cls, filename, package):
        descriptor = cls.registry.get(filename)
        if not descriptor:
            descriptor = cls.registry[filename] = cls(
                descriptor=descriptor_pb2.FileDescriptorProto(
                    name=filename, package=package, syntax="proto3",
                ),
                enums=collections.OrderedDict(),

                messages=collections.OrderedDict(),