# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/notification/v1/keyapis_notification_push_token_v1.proto, keyapis/notification/v1/keyapis_notification_system_v1.proto
# plugin: python-betterproto
# This file has been @generated
import warnings
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 PushTokenType(betterproto.Enum):
    """
    Справочников типов пуш-токенов.
     # Тип: byte
    """

    TYPE_UNKNOWN = 0
    """Не указан"""

    MOBILE_FCM = 1
    """Для Mobile Firebase Cloud Messaging"""

    MOBILE_HMS = 2
    """Для Mobile Huawei Messaging System"""

    MOBILE_APNS_TEXT = 3
    """Для Mobile Apple PushToken System для текста"""

    MOBILE_APNS_CALL = 4
    """Для Mobile Apple PushToken System для звонков"""

    PWA_FCM = 5
    """Для PWA Firebase Cloud Messaging"""

    PWA_APNS = 6
    """Для PWA Apple PushToken System"""

    MOBILE_RUSTORE = 7
    """Для Mobile RuStore"""

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

        return core_schema.int_schema(ge=0)


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

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

    ID = 1
    """По идентификатору"""

    CREATED_AT = 2
    """По времени создания"""

    CHANGED_AT = 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 PushTokenPagingDirectionType(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 GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PushToken(betterproto.Message):
    """
    Пуш-токен.
     # Описание модели
    """

    id: int = betterproto.int32_field(1)
    """
    Идентификатор.
     # Диапазон: 0..2147483647
    """

    type: "PushTokenType" = betterproto.enum_field(2)
    """Тип"""

    token: str = betterproto.string_field(3)
    """
    Токен.
     # Диапазон: 16..256
    """

    user_app_id: str = betterproto.string_field(4)
    """
    Идентификатор устройства пользователя.
     # Тип: Guid
    """

    user_id: "int | None" = betterproto.message_field(5, wraps=betterproto.TYPE_INT32)
    """
    Идентификатор пользователя.
     # Диапазон: 1..2147483647
    """

    created_at: datetime = betterproto.message_field(6)
    """
    Дата и время создания.
     # Тип: DateTime
    """

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

    app_version: str = betterproto.string_field(8)
    """
    Версия приложения.
     # Диапазон: 3..256
    """


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

    user_app_id: "PushTokenValidationErrorUserAppIdInvalid | 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 PushTokenValidationErrorUserAppIdInvalid(betterproto.Message):
    """
    Причины:
     - Cодержит значение не Guid
    """

    pass


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

    user_app_id_exists: "PushTokenSavingErrorUserAppIdExists | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Идентификатор устройства пользователя уже используется"""

    conflict: "PushTokenSavingErrorConflict | 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 PushTokenSavingErrorUserAppIdExists(betterproto.Message):
    """
    Причины:
      - Переданный индентификатор устройства пользователя уже существует с другим токеном
    """

    pass


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PushTokenFilter(betterproto.Message):
    """Фильтр по пуш-токенам"""

    types: "list[PushTokenType]" = betterproto.enum_field(1)
    """По типам пуш-токенов"""

    user_app_ids: "list[str]" = betterproto.string_field(2)
    """
    По идентификаторам устройств пользователя.
     # Тип: Guid
    """

    user_ids: "list[int]" = betterproto.int32_field(3)
    """По идентификаторам пользователя"""

    begin_created_at: datetime = betterproto.message_field(4)
    """От даты создания включительно (>=)"""

    end_created_at: datetime = betterproto.message_field(5)
    """До даты создания (<)"""

    begin_changed_at: datetime = betterproto.message_field(6)
    """От даты изменения включительно (>=)"""

    end_changed_at: datetime = betterproto.message_field(7)
    """До даты изменения (<)"""


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

    user_app_ids: "PushTokenFilterValidationErrorUserAppIdsInvalid | 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 PushTokenFilterValidationErrorUserAppIdsInvalid(betterproto.Message):
    """
    Причины:
     - Cодержит значение не Guid
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PushTokenPaging(betterproto.Message):
    """Постраничный вывод"""

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

    direction_type: "PushTokenPagingDirectionType" = 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 PushTokenPagingValidationError(betterproto.Message):
    """
    Ошибка валидации постраничной пагинации по пуш-токенам.
     Эти проверки выполняются до обращения в базу данных
    """

    limit: "PushTokenPagingValidationErrorLimitInvalid | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Количество передано некорректно"""

    offset: "PushTokenPagingValidationErrorOffsetInvalid | 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 PushTokenPagingValidationErrorLimitInvalid(betterproto.Message):
    """
    Причины:
     - Значение количества < 0 или > 100
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PushTokenPagingValidationErrorOffsetInvalid(betterproto.Message):
    """
    Причины:
     - Значение сдвига < 0
    """

    pass


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

    data: "PushToken" = betterproto.message_field(1)
    """Пуш-токен"""


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

    data: "PushToken | None" = betterproto.message_field(1, optional=True, group="type")
    """Пуш-токен"""

    error: "PostPushTokenResponseError | 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 PostPushTokenResponseError(betterproto.Message):
    """Ошибка запроса сохранения пуш-токена"""

    push_token_validation: "PushTokenValidationError | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Ошибка валидации пуш-токена"""

    push_token_saving: "PushTokenSavingError | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Ошибка сохранения пуш-токена"""

    validation: "ValidationError | None" = betterproto.message_field(
        3, optional=True, group="reason"
    )
    """Ошибка валидации пуш-токена"""

    def __post_init__(self) -> None:
        super().__post_init__()
        if self.is_set("push_token_validation"):
            warnings.warn(
                "PostPushTokenResponseError.push_token_validation is deprecated",
                DeprecationWarning,
            )

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


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

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

    paging: "PushTokenPaging | 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 GetPushTokenCountRequest(betterproto.Message):
    """Запрос получения количества пуш-токенов"""

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


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

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего пуш-токенов"""

    error: "GetPushTokenCountResponseError | 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 GetPushTokenCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества пуш-токенов"""

    push_token_filter_validation: "PushTokenFilterValidationError | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Ошибка фильтрации"""

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

    def __post_init__(self) -> None:
        super().__post_init__()
        if self.is_set("push_token_filter_validation"):
            warnings.warn(
                "GetPushTokenCountResponseError.push_token_filter_validation is deprecated",
                DeprecationWarning,
            )

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


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

    data: "PushToken | None" = betterproto.message_field(1, optional=True, group="type")
    """Пуш-токен"""

    error: "GetPushTokenListResponseError | 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 GetPushTokenListResponseError(betterproto.Message):
    """Ошибка запроса получения списка пуш-токенов"""

    push_token_filter_validation: "PushTokenFilterValidationError | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Ошибка фильтрации"""

    push_token_paging_validation: "PushTokenPagingValidationError | None" = (
        betterproto.message_field(2, optional=True, group="reason")
    )
    """Ошибка пагинации по страницам"""

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

    def __post_init__(self) -> None:
        super().__post_init__()
        if self.is_set("push_token_filter_validation"):
            warnings.warn(
                "GetPushTokenListResponseError.push_token_filter_validation is deprecated",
                DeprecationWarning,
            )
        if self.is_set("push_token_paging_validation"):
            warnings.warn(
                "GetPushTokenListResponseError.push_token_paging_validation is deprecated",
                DeprecationWarning,
            )

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


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

    id: int = betterproto.int32_field(1)
    """
    Идентификатор.
     # Диапазон: 0..2147483647
    """


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

    error: "DeletePushTokenResponseError | 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 DeletePushTokenResponseError(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 DeletePushTokenUserIdRequest(betterproto.Message):
    """Запрос удаления пуш-токенов по идентификатору пользователя"""

    user_id: int = betterproto.int32_field(1)
    """
    Идентификатор пользователя.
     # Диапазон: 1..2147483647
    """


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

    error: "DeletePushTokenUserIdResponseError | 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 DeletePushTokenUserIdResponseError(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 DeletePushTokenUserAppIdRequest(betterproto.Message):
    """Запрос удаления пуш-токена по идентификатору устройства пользователя"""

    user_app_id: str = betterproto.string_field(1)
    """
    Идентификатор устройства пользователя.
     # Тип: Guid
    """


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

    error: "DeletePushTokenUserAppIdResponseError | 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 DeletePushTokenUserAppIdResponseError(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)
    """Валидационное сообщение"""


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.notification.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class PushTokenServiceStub(betterproto.ServiceStub):
    async def post_push_token(
        self,
        post_push_token_request: "PostPushTokenRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostPushTokenResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/PostPushToken",
            post_push_token_request,
            PostPushTokenResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_push_token_list(
        self,
        get_push_token_list_request: "GetPushTokenListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetPushTokenListResponse]":
        async for response in self._unary_stream(
            "/keyapis.notification.v1.PushTokenService/GetPushTokenList",
            get_push_token_list_request,
            GetPushTokenListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_push_token_count(
        self,
        get_push_token_count_request: "GetPushTokenCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetPushTokenCountResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/GetPushTokenCount",
            get_push_token_count_request,
            GetPushTokenCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_push_token(
        self,
        delete_push_token_request: "DeletePushTokenRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeletePushTokenResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/DeletePushToken",
            delete_push_token_request,
            DeletePushTokenResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_push_token_user_app_id(
        self,
        delete_push_token_user_app_id_request: "DeletePushTokenUserAppIdRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeletePushTokenUserAppIdResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/DeletePushTokenUserAppId",
            delete_push_token_user_app_id_request,
            DeletePushTokenUserAppIdResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_push_token_user_id(
        self,
        delete_push_token_user_id_request: "DeletePushTokenUserIdRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeletePushTokenUserIdResponse":
        return await self._unary_unary(
            "/keyapis.notification.v1.PushTokenService/DeletePushTokenUserId",
            delete_push_token_user_id_request,
            DeletePushTokenUserIdResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


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.notification.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


class PushTokenServiceBase(ServiceBase):

    async def post_push_token(
        self, post_push_token_request: "PostPushTokenRequest"
    ) -> "PostPushTokenResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_push_token_list(
        self, get_push_token_list_request: "GetPushTokenListRequest"
    ) -> "AsyncIterator[GetPushTokenListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetPushTokenListResponse()

    async def get_push_token_count(
        self, get_push_token_count_request: "GetPushTokenCountRequest"
    ) -> "GetPushTokenCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_push_token(
        self, delete_push_token_request: "DeletePushTokenRequest"
    ) -> "DeletePushTokenResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_push_token_user_app_id(
        self, delete_push_token_user_app_id_request: "DeletePushTokenUserAppIdRequest"
    ) -> "DeletePushTokenUserAppIdResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_push_token_user_id(
        self, delete_push_token_user_id_request: "DeletePushTokenUserIdRequest"
    ) -> "DeletePushTokenUserIdResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_push_token(
        self,
        stream: "grpclib.server.Stream[PostPushTokenRequest, PostPushTokenResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_push_token(request)
        await stream.send_message(response)

    async def __rpc_get_push_token_list(
        self,
        stream: "grpclib.server.Stream[GetPushTokenListRequest, GetPushTokenListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_push_token_list,
            stream,
            request,
        )

    async def __rpc_get_push_token_count(
        self,
        stream: "grpclib.server.Stream[GetPushTokenCountRequest, GetPushTokenCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_push_token_count(request)
        await stream.send_message(response)

    async def __rpc_delete_push_token(
        self,
        stream: "grpclib.server.Stream[DeletePushTokenRequest, DeletePushTokenResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_push_token(request)
        await stream.send_message(response)

    async def __rpc_delete_push_token_user_app_id(
        self,
        stream: "grpclib.server.Stream[DeletePushTokenUserAppIdRequest, DeletePushTokenUserAppIdResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_push_token_user_app_id(request)
        await stream.send_message(response)

    async def __rpc_delete_push_token_user_id(
        self,
        stream: "grpclib.server.Stream[DeletePushTokenUserIdRequest, DeletePushTokenUserIdResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_push_token_user_id(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.notification.v1.PushTokenService/PostPushToken": grpclib.const.Handler(
                self.__rpc_post_push_token,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostPushTokenRequest,
                PostPushTokenResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/GetPushTokenList": grpclib.const.Handler(
                self.__rpc_get_push_token_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetPushTokenListRequest,
                GetPushTokenListResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/GetPushTokenCount": grpclib.const.Handler(
                self.__rpc_get_push_token_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPushTokenCountRequest,
                GetPushTokenCountResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/DeletePushToken": grpclib.const.Handler(
                self.__rpc_delete_push_token,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeletePushTokenRequest,
                DeletePushTokenResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/DeletePushTokenUserAppId": grpclib.const.Handler(
                self.__rpc_delete_push_token_user_app_id,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeletePushTokenUserAppIdRequest,
                DeletePushTokenUserAppIdResponse,
            ),
            "/keyapis.notification.v1.PushTokenService/DeletePushTokenUserId": grpclib.const.Handler(
                self.__rpc_delete_push_token_user_id,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeletePushTokenUserIdRequest,
                DeletePushTokenUserIdResponse,
            ),
        }


rebuild_dataclass(PushToken)  # type: ignore
rebuild_dataclass(PushTokenValidationError)  # type: ignore
rebuild_dataclass(PushTokenSavingError)  # type: ignore
rebuild_dataclass(PushTokenFilter)  # type: ignore
rebuild_dataclass(PushTokenFilterValidationError)  # type: ignore
rebuild_dataclass(PushTokenPaging)  # type: ignore
rebuild_dataclass(PushTokenPagingValidationError)  # type: ignore
rebuild_dataclass(PostPushTokenRequest)  # type: ignore
rebuild_dataclass(PostPushTokenResponse)  # type: ignore
rebuild_dataclass(PostPushTokenResponseError)  # type: ignore
rebuild_dataclass(GetPushTokenListRequest)  # type: ignore
rebuild_dataclass(GetPushTokenCountRequest)  # type: ignore
rebuild_dataclass(GetPushTokenCountResponse)  # type: ignore
rebuild_dataclass(GetPushTokenCountResponseError)  # type: ignore
rebuild_dataclass(GetPushTokenListResponse)  # type: ignore
rebuild_dataclass(GetPushTokenListResponseError)  # type: ignore
rebuild_dataclass(DeletePushTokenResponse)  # type: ignore
rebuild_dataclass(DeletePushTokenResponseError)  # type: ignore
rebuild_dataclass(DeletePushTokenUserIdResponse)  # type: ignore
rebuild_dataclass(DeletePushTokenUserIdResponseError)  # type: ignore
rebuild_dataclass(DeletePushTokenUserAppIdResponse)  # type: ignore
rebuild_dataclass(DeletePushTokenUserAppIdResponseError)  # type: ignore
