# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/rfidregistry/v1/keyapis_rfidregistry_record_v1.proto, keyapis/rfidregistry/v1/keyapis_rfidregistry_system_v1.proto
# plugin: python-betterproto
# This file has been @generated

from collections.abc import AsyncIterator
from datetime import datetime
from typing import TYPE_CHECKING

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase
from pydantic import model_validator
from pydantic.dataclasses import (
    dataclass,
    rebuild_dataclass,
)

if TYPE_CHECKING:
    import grpclib.server
    from betterproto.grpc.grpclib_client import MetadataLike
    from grpclib.metadata import Deadline


class RecordRfidType(betterproto.Enum):
    """
    Справочник типов ключей.
     # Тип: byte
    """

    RFID_TYPE_UNKNOWN = 0
    """Значение не указано"""

    FOB = 1
    """Брелок"""

    CARD = 2
    """Карта"""

    BAND = 3
    """Браслет"""

    STICKER = 4
    """Стикер"""

    ACTIVE_TAG = 5
    """Активная метка"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class RecordEncryptionType(betterproto.Enum):
    """
    Справочник типов шифрования ключа.
     # Тип: byte
    """

    ENCRYPTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    SL0 = 1
    """Без шифрования"""

    SL1 = 2
    """С шифрованием, копируемый"""

    SL3 = 3
    """С шифрованием, не копируемый"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class RecordStatusType(betterproto.Enum):
    """
    Справочник типов статусов ключа.
     # Тип: byte
    """

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    NEW = 1
    """Новый"""

    SHIPPED = 2
    """Отгружен"""

    DEFECT = 3
    """Брак"""

    IN_USE = 4
    """Использован"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class RecordIdentificationMethodType(betterproto.Enum):
    """
    Справочник методов идентификации.
     # Тип: byte
    """

    IDENTIFICATION_METHOD_TYPE_UNKNOWN = 0
    """Значение не указано"""

    MIFARE = 1
    """Значение Mifare"""

    BLE = 2
    """Значение Bluetooth low energy"""

    UHF = 3
    """Значение Ultra high frequency"""

    EM_MARINE = 4
    """Значение em-marine"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class RecordPagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    NEW_AT = 1
    """По дате перевода в статус new (дате создания)"""

    CHANGED_AT = 2
    """По времени изменения"""

    ORDER_AT = 3
    """По времени заказа"""

    ORDER_NUMBER = 4
    """По номеру заказа"""

    RANK = 5
    """
    По рангу для поиска по тексту.
     Применяется когда передано поле для поиска по тексту.
     В случае если текстовое поле не передано, применяется значение по умолчанию
    """

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class RecordPagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки.
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Record(betterproto.Message):
    """
    Запись.
     # Описание модели
    """

    id: str = betterproto.string_field(1)
    """
    Идентификатор.
     Если не передан создаётся сервером.
     # Тип: Guid
    """

    rfid_type: "RecordRfidType" = betterproto.enum_field(2)
    """Тип ключа"""

    encryption_type: "RecordEncryptionType" = betterproto.enum_field(3)
    """
    Тип шифрования ключа.
     Максимально поддерживаемый ключом тип шифрования
    """

    uid: str = betterproto.string_field(4)
    """
    Номер ключа.
     Указывается при создании.
     # Диапазон: 1..14
    """

    status_type: "RecordStatusType" = betterproto.enum_field(5)
    """Тип статуса ключа"""

    new_at: datetime = betterproto.message_field(6)
    """
    Дата перевода в статус "Новый".
     # Тип: DateTime
    """

    shipped_at: datetime = betterproto.message_field(7)
    """
    Дата перевода в статус "Отгружен".
     # Тип: DateTime
    """

    defect_at: datetime = betterproto.message_field(8)
    """
    Дата перевода в статус "Брак".
     # Тип: DateTime
    """

    in_use_at: datetime = betterproto.message_field(9)
    """
    Дата перевода в статус "Использован".
     # Тип: DateTime
    """

    in_use_rfid_id: "str | None" = betterproto.message_field(
        10, wraps=betterproto.TYPE_STRING
    )
    """
    Идентификатор привязанного ключа.
     Заполняется при переводе в статус "Использован".
     # Диапазон: 0..16
    """

    data_cells: "list[RecordDataCell]" = betterproto.message_field(11)
    """Содержимое ячеек ключа"""

    resource_owner_id: str = betterproto.string_field(12)
    """
    Идентификатор владельца.
     Заполняется сервером.
     # Диапазон: 0..255
    """

    package_info_box: int = betterproto.int32_field(13)
    """
    Номер коробки.
     # Диапазон: 1..2147483647
    """

    package_info_place: int = betterproto.int32_field(14)
    """
    Номер места в коробке.
     # Диапазон: 1..2147483647
    """

    changed_at: datetime = betterproto.message_field(15)
    """
    Дата последнего изменения.
     Заполняется и обновляется сервером.
     Заполняется при создании и изменении.
     Является версией объекта.
     # Тип: DateTime
    """

    aes_key_configurations: "list[RecordAesKeyConfiguration]" = (
        betterproto.message_field(16)
    )
    """Конфигурации шифрования ключа"""

    trailers: "list[RecordTrailer]" = betterproto.message_field(17)
    """
    Контрольные суммы.
     Нужны для ключей SL1 и SL3
    """

    order_number: str = betterproto.string_field(18)
    """
    Номер заказа.
     # Диапазон: 0..256
    """

    order_at: datetime = betterproto.message_field(19)
    """
    Дата заказа.
     # Тип: DateTime
    """

    in_use_resource_owner_id: "str | None" = betterproto.message_field(
        20, wraps=betterproto.TYPE_STRING
    )
    """
    Владелец привязанного ключа.
     Заполняется сервером, значение берётся из токена при использовании ключа.
     # Диапазон: 0..255
    """

    is_deleted: bool = betterproto.bool_field(21)
    """Признак, удалена ли запись"""

    deleted_at: datetime = betterproto.message_field(22)
    """
    Дата удаления.
     # Тип: DateTime
    """

    vendor_name: "str | None" = betterproto.message_field(
        23, wraps=betterproto.TYPE_STRING
    )
    """
    Производитель.
     # Диапазон: 3..100
    """

    identification_method_type: "RecordIdentificationMethodType" = (
        betterproto.enum_field(24)
    )
    """Метод идентификации"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordDataCell(betterproto.Message):
    """Содержимое ячейки ключа"""

    section: int = betterproto.int32_field(1)
    """
    Сектор.
     # Диапазон: 0..127
    """

    block: int = betterproto.int32_field(2)
    """
    Блок.
     # Диапазон: 0..127
    """

    data: str = betterproto.string_field(3)
    """
    Данные.
     # Паттерн: /^[A-Za-z0-9=]+$/
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordAesKeyConfiguration(betterproto.Message):
    """Конфигурация шифрования ключа"""

    address: str = betterproto.string_field(1)
    """
    Адрес.
     # Паттерн: /^[A-Za-z0-9=]+$/
    """

    data: str = betterproto.string_field(2)
    """
    Данные.
     # Паттерн: /^[A-Za-z0-9=]+$/
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordTrailer(betterproto.Message):
    """Контрольная сумма"""

    sector: int = betterproto.int32_field(1)
    """
    Сектор.
     # Диапазон: 0..15
    """

    key_a: str = betterproto.string_field(2)
    """
    Ключ А.
     # Диапазон: 1..256
    """

    key_b: str = betterproto.string_field(3)
    """
    Ключ Б.
     # Диапазон: 1..256
    """

    access_mask: str = betterproto.string_field(4)
    """
    Маска доступа.
     # Диапазон: 1..512
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordSavingError(betterproto.Message):
    """
    Ошибка сохранения записи.
     Эти проверки выполняются при работе с базой данных и сторонними сервисами
    """

    status_type_restricted: "RecordSavingErrorStatusTypeRestricted | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Перевод статуса запрещён"""

    uid_exist: "RecordSavingErrorUidExist | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Запись уже существует"""

    owned_by_another_user: "RecordSavingErrorOwnedByAnotherUser | None" = (
        betterproto.message_field(3, optional=True, group="reason")
    )
    """Вы не владелец"""

    already_linked: "RecordSavingErrorAlreadyLinked | None" = betterproto.message_field(
        4, optional=True, group="reason"
    )
    """Ключ уже использован"""

    conflict: "RecordSavingErrorConflict | None" = betterproto.message_field(
        5, optional=True, group="reason"
    )
    """Конфликт версий"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordSavingErrorStatusTypeRestricted(betterproto.Message):
    """
    Причины:
     - Недопустимый перевод статуса.
     - Не переданы обязательные поля https://openapi-key.deploy.rtkit.dev/keyapis_rfidregistry_v1/#таблица-обязательности-передачи-полей-в-request
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordSavingErrorUidExist(betterproto.Message):
    """
    Причины:
     - Ключ уже существует
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordSavingErrorOwnedByAnotherUser(betterproto.Message):
    """
    Причины:
     - Запись принадлежит другому пользователю
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordSavingErrorAlreadyLinked(betterproto.Message):
    """
    Причины:
     - Такой ключ уже привязан к другой записи
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordSavingErrorConflict(betterproto.Message):
    """
    Причины:
     - В базе хранится более новая версия записи, значения changed_at отличаются
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordFilter(betterproto.Message):
    """Фильтр записей"""

    rfid_types: "list[RecordRfidType]" = betterproto.enum_field(1)
    """По типам ключей"""

    encryption_types: "list[RecordEncryptionType]" = betterproto.enum_field(2)
    """По типам шифрования"""

    uids: "list[str]" = betterproto.string_field(3)
    """По номерам ключей"""

    status_types: "list[RecordStatusType]" = betterproto.enum_field(4)
    """По типам статуса"""

    in_use_rfid_ids: "list[str]" = betterproto.string_field(5)
    """По номерам привязанных ключей"""

    resource_owner_ids: "list[str]" = betterproto.string_field(6)
    """По владельцам"""

    order_numbers: "list[str]" = betterproto.string_field(7)
    """По номерам заказа"""

    in_use_resource_owner_ids: "list[str]" = betterproto.string_field(8)
    """По владельцам привязанных ключей"""

    is_deleted: "bool | None" = betterproto.message_field(
        9, wraps=betterproto.TYPE_BOOL
    )
    """
    По удалённым записям.
     По умолчанию: false
    """

    text: "str | None" = betterproto.message_field(10, wraps=betterproto.TYPE_STRING)
    """
    По тексту.
     Если значение не передано то поиск по нему не производится.
     # Диапазон: 3..64.
     # Поиск производится по полям:
     # - Номер заказа;
     # - Производитель
    """

    start_shipped_at: datetime = betterproto.message_field(11)
    """Дата отгрузки от"""

    end_shipped_at: datetime = betterproto.message_field(12)
    """Дата отгрузки до"""

    package_info_boxes: "list[int]" = betterproto.int32_field(13)
    """По номеру коробки"""

    package_info_places: "list[int]" = betterproto.int32_field(14)
    """По номеру места в коробке"""

    identification_method_types: "list[RecordIdentificationMethodType]" = (
        betterproto.enum_field(15)
    )
    """По методу идентификации"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RecordPaging(betterproto.Message):
    """Пагинация записей"""

    order_by_type: "RecordPagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию.
     # По умолчанию: NEW_AT
    """

    direction_type: "RecordPagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..100.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostRecordRequest(betterproto.Message):
    """Запрос сохранения записи"""

    data: "Record" = betterproto.message_field(1)
    """Запись"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostRecordResponse(betterproto.Message):
    """Ответ на запрос сохранения записи"""

    data: "Record | None" = betterproto.message_field(1, optional=True, group="type")
    """Запись"""

    error: "PostRecordResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostRecordResponseError(betterproto.Message):
    """Ошибка запроса сохранения записи"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    saving: "RecordSavingError | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Ошибка сохранения записи"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetRecordRequest(betterproto.Message):
    """Запрос получения записи"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetRecordResponse(betterproto.Message):
    """Ответ на запрос получения записи"""

    data: "Record | None" = betterproto.message_field(1, optional=True, group="type")
    """Запись"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetRecordCountRequest(betterproto.Message):
    """Запрос получения количества записей"""

    filter: "RecordFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetRecordCountResponse(betterproto.Message):
    """Ответ на запрос получения количества записей"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего записей"""

    error: "GetRecordCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetRecordCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества записей"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка фильтрации записей"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetRecordListRequest(betterproto.Message):
    """Запрос получения списка"""

    filter: "RecordFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "RecordPaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Пагинация"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetRecordListResponse(betterproto.Message):
    """Ответ на запрос получения списка записей"""

    data: "Record | None" = betterproto.message_field(1, optional=True, group="type")
    """Запись"""

    error: "GetRecordListResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetRecordListResponseError(betterproto.Message):
    """Ошибка запроса получения списка записей"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка фильтрации записей"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteRecordRequest(betterproto.Message):
    """
    Запрос удаления записи из реестра.
     Можно удалить только свои записи
    """

    id: str = betterproto.string_field(1)
    """
    Идентификатор записи.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteRecordResponse(betterproto.Message):
    """Ответ на запрос удаления записи из реестра"""

    error: "DeleteRecordResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteRecordResponseError(betterproto.Message):
    """Ошибка удаления записи"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ValidationError(betterproto.Message):
    """
    Ошибки валидации.
     Эти проверки выполняются до обращения в базу данных
    """

    path: str = betterproto.string_field(1)
    """Путь к полю в формате наименования прото"""

    message: str = betterproto.string_field(2)
    """Валидационное сообщение"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSystemStatusResponse(betterproto.Message):
    """Ответ на запрос проверки доступности сервиса"""

    pass


class RecordServiceStub(betterproto.ServiceStub):
    async def post_record(
        self,
        post_record_request: "PostRecordRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostRecordResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.RecordService/PostRecord",
            post_record_request,
            PostRecordResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_record(
        self,
        get_record_request: "GetRecordRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetRecordResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.RecordService/GetRecord",
            get_record_request,
            GetRecordResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_record_list(
        self,
        get_record_list_request: "GetRecordListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetRecordListResponse]":
        async for response in self._unary_stream(
            "/keyapis.rfidregistry.v1.RecordService/GetRecordList",
            get_record_list_request,
            GetRecordListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_record_count(
        self,
        get_record_count_request: "GetRecordCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetRecordCountResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.RecordService/GetRecordCount",
            get_record_count_request,
            GetRecordCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_record(
        self,
        delete_record_request: "DeleteRecordRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteRecordResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.RecordService/DeleteRecord",
            delete_record_request,
            DeleteRecordResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class SystemServiceStub(betterproto.ServiceStub):
    async def get_system_status(
        self,
        get_system_status_request: "GetSystemStatusRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetSystemStatusResponse":
        return await self._unary_unary(
            "/keyapis.rfidregistry.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class RecordServiceBase(ServiceBase):

    async def post_record(
        self, post_record_request: "PostRecordRequest"
    ) -> "PostRecordResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_record(
        self, get_record_request: "GetRecordRequest"
    ) -> "GetRecordResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_record_list(
        self, get_record_list_request: "GetRecordListRequest"
    ) -> "AsyncIterator[GetRecordListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetRecordListResponse()

    async def get_record_count(
        self, get_record_count_request: "GetRecordCountRequest"
    ) -> "GetRecordCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_record(
        self, delete_record_request: "DeleteRecordRequest"
    ) -> "DeleteRecordResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_record(
        self, stream: "grpclib.server.Stream[PostRecordRequest, PostRecordResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_record(request)
        await stream.send_message(response)

    async def __rpc_get_record(
        self, stream: "grpclib.server.Stream[GetRecordRequest, GetRecordResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_record(request)
        await stream.send_message(response)

    async def __rpc_get_record_list(
        self,
        stream: "grpclib.server.Stream[GetRecordListRequest, GetRecordListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_record_list,
            stream,
            request,
        )

    async def __rpc_get_record_count(
        self,
        stream: "grpclib.server.Stream[GetRecordCountRequest, GetRecordCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_record_count(request)
        await stream.send_message(response)

    async def __rpc_delete_record(
        self, stream: "grpclib.server.Stream[DeleteRecordRequest, DeleteRecordResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_record(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.rfidregistry.v1.RecordService/PostRecord": grpclib.const.Handler(
                self.__rpc_post_record,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostRecordRequest,
                PostRecordResponse,
            ),
            "/keyapis.rfidregistry.v1.RecordService/GetRecord": grpclib.const.Handler(
                self.__rpc_get_record,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRecordRequest,
                GetRecordResponse,
            ),
            "/keyapis.rfidregistry.v1.RecordService/GetRecordList": grpclib.const.Handler(
                self.__rpc_get_record_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetRecordListRequest,
                GetRecordListResponse,
            ),
            "/keyapis.rfidregistry.v1.RecordService/GetRecordCount": grpclib.const.Handler(
                self.__rpc_get_record_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRecordCountRequest,
                GetRecordCountResponse,
            ),
            "/keyapis.rfidregistry.v1.RecordService/DeleteRecord": grpclib.const.Handler(
                self.__rpc_delete_record,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteRecordRequest,
                DeleteRecordResponse,
            ),
        }


class SystemServiceBase(ServiceBase):

    async def get_system_status(
        self, get_system_status_request: "GetSystemStatusRequest"
    ) -> "GetSystemStatusResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_system_status(
        self,
        stream: "grpclib.server.Stream[GetSystemStatusRequest, GetSystemStatusResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_system_status(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.rfidregistry.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


rebuild_dataclass(Record)  # type: ignore
rebuild_dataclass(RecordSavingError)  # type: ignore
rebuild_dataclass(RecordFilter)  # type: ignore
rebuild_dataclass(RecordPaging)  # type: ignore
rebuild_dataclass(PostRecordRequest)  # type: ignore
rebuild_dataclass(PostRecordResponse)  # type: ignore
rebuild_dataclass(PostRecordResponseError)  # type: ignore
rebuild_dataclass(GetRecordResponse)  # type: ignore
rebuild_dataclass(GetRecordCountRequest)  # type: ignore
rebuild_dataclass(GetRecordCountResponse)  # type: ignore
rebuild_dataclass(GetRecordCountResponseError)  # type: ignore
rebuild_dataclass(GetRecordListRequest)  # type: ignore
rebuild_dataclass(GetRecordListResponse)  # type: ignore
rebuild_dataclass(GetRecordListResponseError)  # type: ignore
rebuild_dataclass(DeleteRecordResponse)  # type: ignore
rebuild_dataclass(DeleteRecordResponseError)  # type: ignore
