# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/access_management/v1/keyapis_access_management_group_v1.proto, keyapis/access_management/v1/keyapis_access_management_system_v1.proto, keyapis/access_management/v1/keyapis_access_management_template_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 GroupPagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

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

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

    TITLE = 2
    """По наименованию"""

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

        return core_schema.int_schema(ge=0)


class GroupPagingDirectionType(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)


class GroupUserPagingOrderByType(betterproto.Enum):
    """Справочник типов сортировки"""

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

    GROUP_ID = 1
    """По Идентификатору группы"""

    USER_ID = 2
    """По Идентификатору пользователя"""

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

        return core_schema.int_schema(ge=0)


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

    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)


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

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

    KEY = 1
    """По ключу атрибута"""

    VALUE = 2
    """По значению атрибута"""

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

        return core_schema.int_schema(ge=0)


class GroupClaimPagingDirectionType(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)


class GroupTemplateGroupPagingOrderByType(betterproto.Enum):
    """Справочник типов сортировки"""

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

    GROUP_ID = 1
    """По Идентификатору группы пользователя"""

    GROUP_TEMPLATE_ID = 2
    """По шаблону групп"""

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

        return core_schema.int_schema(ge=0)


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

    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)


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

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

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

    TITLE = 2
    """По наименованию"""

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

        return core_schema.int_schema(ge=0)


class GroupTemplatePagingDirectionType(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 PutGroupApiKeyCreateRequest(betterproto.Message):
    """Запрос на добавления группе ключа доступа ApiKey"""

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


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

    data: "str | None" = betterproto.string_field(1, optional=True, group="type")
    """
    Значение ключа доступа ApiKey.
     # Тип: Guid
    """

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


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

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


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Claim(betterproto.Message):
    """Атрибут пользователя"""

    key: str = betterproto.string_field(1)
    """Ключ атрибута"""

    value: str = betterproto.string_field(2)
    """Значение атрибута"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class UserGroup(betterproto.Message):
    """Связка пользователя с группой"""

    user_id: str = betterproto.string_field(1)
    """
    Идентификатор пользователя.
     Соответствует subject, sub, client_id из JWT.
     # Диапазон: 3..256
    """

    group_id: str = betterproto.string_field(2)
    """
    Идентификатор группы.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Group(betterproto.Message):
    """Группа атрибутов пользователя"""

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

    title: str = betterproto.string_field(2)
    """
    Наименование.
     # Диапазон: 3..256
    """

    description: str = betterproto.string_field(3)
    """
    Описание.
     # Диапазон: 3..256
    """

    claims: "list[Claim]" = betterproto.message_field(4)
    """
    Массив атрибутов группы.
     Эти атрибуты назначены пользователям, которые принадлежат группе.
     # Диапазон: 0..100
    """

    requirements: "list[Claim]" = betterproto.message_field(5)
    """
    Требования, означающие принадлежность пользователя к данной группе.
     Пользователь принадлежит группе, если все атрибуты требований группы присутствуют у пользователя и имеют те же значения.
     # Диапазон: 0..10
    """

    deleted_at: datetime = betterproto.message_field(6)
    """
    Дата удаления группы из использования.
     Группа не участвует в определении разрешений пользователя, если дата deleted_at непустая и уже в прошлом
    """

    tags: "list[str]" = betterproto.string_field(7)
    """
    Теги группы.
     # Диапазон: 0..10
    """


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

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


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

    data: "Group | None" = betterproto.message_field(1, optional=True, group="type")
    """Группа"""

    error: "GetGroupResponseError | 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 GetGroupResponseError(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 GetGroupListRequest(betterproto.Message):
    """Запрос получения списка групп"""

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

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

    data: "Group | None" = betterproto.message_field(1, optional=True, group="type")
    """Группа"""

    error: "GetGroupListResponseError | 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 GetGroupListResponseError(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 GetGroupCountRequest(betterproto.Message):
    """Запрос получения количества групп"""

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


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

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

    error: "GetGroupCountResponseError | 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 GetGroupCountResponseError(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 GroupFilter(betterproto.Message):
    """Фильтр групп"""

    text: str = betterproto.string_field(1)
    """
    По тексту.
     Если значение не передано то поиск по нему не производится.
     # Диапазон: 3..64.
     # Поиск производится по полям:
     # - Наименование
    """

    requirements: "dict[str, str]" = betterproto.map_field(
        2, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """
    По requirements группы.
     Возвращаем группы, у которых Group.requirements.key=GroupFilter.requirements[n].key И Group.requirements.value=GroupFilter.requirements[n].value.
     При пустом GroupFilter.requirements[n].value возвращаем все группы, у которых Group.requirements.key=GroupFilter.requirements[n].key.
     При передаче нескольких элементов map они работают в выборке через И
    """

    claims: "dict[str, str]" = betterproto.map_field(
        3, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """
    По claims группы.
     Возвращаем группы, у которых Group.claim.key=GroupFilter.claims[n].key И Group.claims.value=GroupFilter.claims[n].value.
     При пустом GroupFilter.claims[n].value возвращаем все группы, у которых Group.claims.key=GroupFilter.claims[n].key.
     При передаче нескольких элементов map они работают в выборке через И
    """

    tags: "list[str]" = betterproto.string_field(4)
    """
    По тегам.
     # Диапазон: 0..10
    """

    hide_deleted: "bool | None" = betterproto.message_field(
        5, wraps=betterproto.TYPE_BOOL
    )
    """
    Скрывать удалённые элементы.
     Если значение — true, возвращаются только записи, у которых deleted_at = null или deleted_at > текущего времени.
     Если значение — false или не задано, возвращаются все записи, включая удалённые
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GroupPaging(betterproto.Message):
    """Пагинация групп"""

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

    direction_type: "GroupPagingDirectionType" = 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 PostGroupRequest(betterproto.Message):
    """Запрос сохранения группы"""

    data: "Group" = betterproto.message_field(1)
    """Группа"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostGroupByTemplateRequest(betterproto.Message):
    """Запрос создания группы по шаблону"""

    group_template_id: str = betterproto.string_field(1)
    """
    Идентификатор шаблона группы.
     # Тип: Guid
    """

    group_title: str = betterproto.string_field(2)
    """
    Наименование создаваемой по шаблону группы.
     В наименование группы будет добавлен суффикс GroupTemplate.group_title_suffix.
     # Диапазон: 3..256
    """

    group_requirements: "list[Claim]" = betterproto.message_field(3)
    """
    Специфичные для создаваемой по шаблону группы Claim requirements, они будут добавлены к requirements создаваемой по шаблону группы.
     # Диапазон: 0..10
    """


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

    data: "Group | None" = betterproto.message_field(1, optional=True, group="type")
    """Группа"""

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

    data: "Group | None" = betterproto.message_field(1, optional=True, group="type")
    """Группа"""

    error: "PostGroupByTemplateResponseError | 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 PostGroupByTemplateResponseError(betterproto.Message):
    """Ошибка запроса создания группы"""

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

    group_template_not_found_error: "GroupTemplateNotFoundError | 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 DeleteGroupRequest(betterproto.Message):
    """Запрос удаления группы"""

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


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

    pass


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

    user_group: "UserGroup" = betterproto.message_field(1)
    """Связь пользователя и группы"""


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

    pass


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

    user_group: "UserGroup" = betterproto.message_field(1)
    """Связь пользователя и группы"""


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

    filter: "GroupUserFilter" = betterproto.message_field(1)
    """Фильтр связей пользователей и групп"""

    paging: "GroupUserPaging | 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 GroupUserPaging(betterproto.Message):
    """Пагинация связей пользователей и групп"""

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

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

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

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     По умолчанию: 0
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GroupUserFilter(betterproto.Message):
    """
    Фильтр для запроса связей пользователей и групп.
     При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ.
     При передаче нескольких разных параметров фильтра они работают в выборке через И
    """

    group_ids: "list[str]" = betterproto.string_field(1)
    """По Идентификаторам группы"""

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


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

    data: "UserGroup | 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 GetGroupUserCountRequest(betterproto.Message):
    """Запрос получения количества связей пользователей и групп"""

    filter: "GroupUserFilter" = betterproto.message_field(1)
    """Фильтр связей пользователей и групп"""


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

    data: "int | None" = betterproto.int32_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 PutGroupUserDetachResponse(betterproto.Message):
    """Ответ на запрос удаления точки доступа в профиль"""

    pass


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

    filter: "GroupClaimFilter" = betterproto.message_field(1)
    """Фильтр атрибутов пользователя"""


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

    data: "int | None" = betterproto.int32_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 GetGroupClaimExistRequest(betterproto.Message):
    """Запрос проверки назначенных атрибутов пользователя"""

    filter: "GroupClaimFilter" = betterproto.message_field(1)
    """Фильтр атрибутов пользователя"""


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

    data: "bool | None" = betterproto.bool_field(1, optional=True, group="type")
    """Флаг наличия"""

    error: "GetGroupClaimExistResponseError | 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 GetGroupClaimExistResponseError(betterproto.Message):
    """Ошибка запроса"""

    claim_filter_empty: (
        "GetGroupClaimExistResponseErrorClaimFilterEmptyError | 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 GetGroupClaimExistResponseErrorClaimFilterEmptyError(betterproto.Message):
    """Ошибка пустого фильтра по атрибутам пользователя"""

    pass


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

    filter: "GroupClaimFilter" = betterproto.message_field(1)
    """Фильтр атрибутов пользователя"""

    paging: "GroupClaimPaging | 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 GetGroupClaimListResponse(betterproto.Message):
    """
    Ответ на запрос уникального списка назначенных атрибутов пользователя
    """

    data: "Claim | 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 GroupClaimFilter(betterproto.Message):
    """Фильтр атрибутов пользователя"""

    user_id: "str | None" = betterproto.message_field(1, wraps=betterproto.TYPE_STRING)
    """
    По идентификатору пользователя.
     Соответствует subject, sub, client_id из JWT.
     Для пользователя Ключа это user_id Ключа
    """

    claims: "dict[str, str]" = betterproto.map_field(
        2, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """
    По назначенным атрибутам пользователя.
     Фильтр ограничивает возвращаемые атрибуты данным списком.
     Возвращаем атрибуты групп, у которых Claim.key=claims[n].key И (Claim.value=claims[n].value ИЛИ claims[n].value пустой).
     При пустом GroupClaimFilter.claims не ограничиваем выдачу, отдаем все Claims, назначенные пользователю
    """

    user_data: "GroupClaimFilterUserData" = betterproto.message_field(3)
    """
    По условию принадлежности к группе.
     Пользователь принадлежит группе, если user_data полностью удовлетворяет требованиям группы, то есть user_data содержит в себе Group.requirements целиком
    """

    api_key_hash: str = betterproto.string_field(4)
    """Хешированное SHA256 значение ключа доступа ApiKey"""


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

    claims: "dict[str, str]" = betterproto.map_field(
        1, betterproto.TYPE_STRING, betterproto.TYPE_STRING
    )
    """Атрибуты пользователя, claims которого мы хотим получить"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GroupClaimPaging(betterproto.Message):
    """Пагинация атрибутов пользователя"""

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

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

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

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


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

    group_template_id: str = betterproto.string_field(1)
    """Идентификатор шаблона группы, который не найден"""

    message: str = betterproto.string_field(2)
    """Сообщение"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GroupTemplate(betterproto.Message):
    """Шаблон группы пользователей"""

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

    title: str = betterproto.string_field(2)
    """
    Наименование шаблона группы.
     # Диапазон: 3..256
    """

    group_title_suffix: str = betterproto.string_field(3)
    """
    Суффикс наименования группы.
     # Диапазон: 3..256
    """

    description: str = betterproto.string_field(4)
    """
    Описание шаблона группы.
     # Диапазон: 3..256
    """

    claims: "list[Claim]" = betterproto.message_field(5)
    """
    Массив атрибутов группы.
     Эти атрибуты назначены пользователям, которые принадлежат группе.
     # Диапазон: 0..100
    """

    requirements: "list[Claim]" = betterproto.message_field(6)
    """
    Требования, означающие принадлежность пользователя к данной группе.
     Пользователь принадлежит группе, если все атрибуты требований группы присутствуют у пользователя и имеют те же значения.
     # Диапазон: 0..10
    """

    tags: "list[str]" = betterproto.string_field(7)
    """
    Теги шаблона группы.
     # Диапазон: 0..10
    """


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

    filter: "GroupTemplateGroupFilter" = betterproto.message_field(1)
    """Фильтр связей шаблонов групп и группы пользователя"""

    paging: "GroupTemplateGroupPaging | 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 GetGroupTemplateGroupCountRequest(betterproto.Message):
    """
    Запрос получения количества связей шаблонов групп и группы пользователя
    """

    filter: "GroupTemplateGroupFilter" = betterproto.message_field(1)
    """Фильтр связей шаблонов групп и группы пользователя"""


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

    data: "int | None" = betterproto.int32_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 GroupTemplateGroupPaging(betterproto.Message):
    """Пагинация шаблонов групп и группы пользователя"""

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

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

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

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     По умолчанию: 0
    """


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

    data: "GroupTemplateGroup | 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 PutGroupTemplateGroupAttachRequest(betterproto.Message):
    """Запрос сохранения связей шаблона группы и группы пользователя"""

    group_template_group: "GroupTemplateGroup" = betterproto.message_field(1)
    """Связь шаблона группы и группы пользователя"""


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutGroupTemplateGroupDetachRequest(betterproto.Message):
    """Запрос удаления связей шаблона группы и группы пользователя"""

    group_template_group: "GroupTemplateGroup" = betterproto.message_field(1)
    """Связь шаблона группы и группы пользователя"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GroupTemplateGroup(betterproto.Message):
    """
    Связка шаблона группы и группы пользователя.
     Задает область ресурсов (resource scope), доступную пользователю.
     Используется для контроля доступа к шаблону группы
    """

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

    group_template_id: str = betterproto.string_field(2)
    """
    Идентификатор шаблона группы.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GroupTemplateGroupFilter(betterproto.Message):
    """
    Фильтр для запроса связей шаблона группы и группы пользователя.
     При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ.
     При передаче нескольких разных параметров фильтра они работают в выборке через И
    """

    group_ids: "list[str]" = betterproto.string_field(1)
    """По Идентификатору группы пользователя"""

    group_template_ids: "list[str]" = betterproto.string_field(2)
    """По шаблону группы"""


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

    pass


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

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


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

    data: "GroupTemplate | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Шаблон группы"""

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

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

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

    data: "GroupTemplate | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Шаблон группы"""

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

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


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

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

    error: "GetGroupTemplateCountResponseError | 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 GetGroupTemplateCountResponseError(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 GroupTemplateFilter(betterproto.Message):
    """
    Фильтр шаблонов групп.
     При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ.
     При передаче нескольких разных параметров фильтра они работают в выборке через И
    """

    text: str = betterproto.string_field(1)
    """
    По тексту.
     Если значение не передано то поиск по нему не производится.
     # Диапазон: 3..64.
     # Поиск производится по полям:
     # - Наименование
    """

    tags: "list[str]" = betterproto.string_field(2)
    """
    По тегам.
     # Диапазон: 0..10
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GroupTemplatePaging(betterproto.Message):
    """Пагинация шаблонов групп"""

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

    direction_type: "GroupTemplatePagingDirectionType" = 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 PostGroupTemplateRequest(betterproto.Message):
    """Запрос сохранения шаблона группы"""

    data: "GroupTemplate" = betterproto.message_field(1)
    """Шаблон группы"""


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

    data: "GroupTemplate | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Шаблон группы"""

    error: "PostGroupTemplateResponseError | 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 PostGroupTemplateResponseError(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 DeleteGroupTemplateRequest(betterproto.Message):
    """Запрос удаления шаблона группы"""

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


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteGroupTemplateResponse(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 GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


class GroupServiceStub(betterproto.ServiceStub):
    async def get_group(
        self,
        get_group_request: "GetGroupRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetGroupResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroup",
            get_group_request,
            GetGroupResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_list(
        self,
        get_group_list_request: "GetGroupListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetGroupListResponse]":
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupService/GetGroupList",
            get_group_list_request,
            GetGroupListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_count(
        self,
        get_group_count_request: "GetGroupCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetGroupCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroupCount",
            get_group_count_request,
            GetGroupCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_group(
        self,
        post_group_request: "PostGroupRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostGroupResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PostGroup",
            post_group_request,
            PostGroupResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_group(
        self,
        delete_group_request: "DeleteGroupRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteGroupResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/DeleteGroup",
            delete_group_request,
            DeleteGroupResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_group_by_template(
        self,
        post_group_by_template_request: "PostGroupByTemplateRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostGroupByTemplateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PostGroupByTemplate",
            post_group_by_template_request,
            PostGroupByTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_user_attach(
        self,
        put_group_user_attach_request: "PutGroupUserAttachRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutGroupUserAttachResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PutGroupUserAttach",
            put_group_user_attach_request,
            PutGroupUserAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_user_detach(
        self,
        put_group_user_detach_request: "PutGroupUserDetachRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutGroupUserDetachResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PutGroupUserDetach",
            put_group_user_detach_request,
            PutGroupUserDetachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_user_list(
        self,
        get_group_user_list_request: "GetGroupUserListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetGroupUserListResponse]":
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupService/GetGroupUserList",
            get_group_user_list_request,
            GetGroupUserListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_user_count(
        self,
        get_group_user_count_request: "GetGroupUserCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetGroupUserCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroupUserCount",
            get_group_user_count_request,
            GetGroupUserCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_claim_list(
        self,
        get_group_claim_list_request: "GetGroupClaimListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetGroupClaimListResponse]":
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupService/GetGroupClaimList",
            get_group_claim_list_request,
            GetGroupClaimListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_claim_count(
        self,
        get_group_claim_count_request: "GetGroupClaimCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetGroupClaimCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroupClaimCount",
            get_group_claim_count_request,
            GetGroupClaimCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_claim_exist(
        self,
        get_group_claim_exist_request: "GetGroupClaimExistRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetGroupClaimExistResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/GetGroupClaimExist",
            get_group_claim_exist_request,
            GetGroupClaimExistResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_api_key_create(
        self,
        put_group_api_key_create_request: "PutGroupApiKeyCreateRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutGroupApiKeyCreateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PutGroupApiKeyCreate",
            put_group_api_key_create_request,
            PutGroupApiKeyCreateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_api_key_delete(
        self,
        put_group_api_key_delete_request: "PutGroupApiKeyDeleteRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutGroupApiKeyDeleteResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupService/PutGroupApiKeyDelete",
            put_group_api_key_delete_request,
            PutGroupApiKeyDeleteResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class GroupTemplateServiceStub(betterproto.ServiceStub):
    async def get_group_template(
        self,
        get_group_template_request: "GetGroupTemplateRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetGroupTemplateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplate",
            get_group_template_request,
            GetGroupTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_template_list(
        self,
        get_group_template_list_request: "GetGroupTemplateListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetGroupTemplateListResponse]":
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateList",
            get_group_template_list_request,
            GetGroupTemplateListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_template_count(
        self,
        get_group_template_count_request: "GetGroupTemplateCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetGroupTemplateCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateCount",
            get_group_template_count_request,
            GetGroupTemplateCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_group_template(
        self,
        post_group_template_request: "PostGroupTemplateRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostGroupTemplateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/PostGroupTemplate",
            post_group_template_request,
            PostGroupTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_group_template(
        self,
        delete_group_template_request: "DeleteGroupTemplateRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteGroupTemplateResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/DeleteGroupTemplate",
            delete_group_template_request,
            DeleteGroupTemplateResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_group_template_group_list(
        self,
        get_group_template_group_list_request: "GetGroupTemplateGroupListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetGroupTemplateGroupListResponse]":
        async for response in self._unary_stream(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateGroupList",
            get_group_template_group_list_request,
            GetGroupTemplateGroupListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_group_template_group_count(
        self,
        get_group_template_group_count_request: "GetGroupTemplateGroupCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetGroupTemplateGroupCountResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateGroupCount",
            get_group_template_group_count_request,
            GetGroupTemplateGroupCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_template_group_attach(
        self,
        put_group_template_group_attach_request: "PutGroupTemplateGroupAttachRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutGroupTemplateGroupAttachResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/PutGroupTemplateGroupAttach",
            put_group_template_group_attach_request,
            PutGroupTemplateGroupAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_group_template_group_detach(
        self,
        put_group_template_group_detach_request: "PutGroupTemplateGroupDetachRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutGroupTemplateGroupDetachResponse":
        return await self._unary_unary(
            "/keyapis.access_management.v1.GroupTemplateService/PutGroupTemplateGroupDetach",
            put_group_template_group_detach_request,
            PutGroupTemplateGroupDetachResponse,
            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.access_management.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class GroupServiceBase(ServiceBase):

    async def get_group(
        self, get_group_request: "GetGroupRequest"
    ) -> "GetGroupResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_list(
        self, get_group_list_request: "GetGroupListRequest"
    ) -> "AsyncIterator[GetGroupListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetGroupListResponse()

    async def get_group_count(
        self, get_group_count_request: "GetGroupCountRequest"
    ) -> "GetGroupCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_group(
        self, post_group_request: "PostGroupRequest"
    ) -> "PostGroupResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_group(
        self, delete_group_request: "DeleteGroupRequest"
    ) -> "DeleteGroupResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_group_by_template(
        self, post_group_by_template_request: "PostGroupByTemplateRequest"
    ) -> "PostGroupByTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_user_attach(
        self, put_group_user_attach_request: "PutGroupUserAttachRequest"
    ) -> "PutGroupUserAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_user_detach(
        self, put_group_user_detach_request: "PutGroupUserDetachRequest"
    ) -> "PutGroupUserDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_user_list(
        self, get_group_user_list_request: "GetGroupUserListRequest"
    ) -> "AsyncIterator[GetGroupUserListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetGroupUserListResponse()

    async def get_group_user_count(
        self, get_group_user_count_request: "GetGroupUserCountRequest"
    ) -> "GetGroupUserCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_claim_list(
        self, get_group_claim_list_request: "GetGroupClaimListRequest"
    ) -> "AsyncIterator[GetGroupClaimListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetGroupClaimListResponse()

    async def get_group_claim_count(
        self, get_group_claim_count_request: "GetGroupClaimCountRequest"
    ) -> "GetGroupClaimCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_claim_exist(
        self, get_group_claim_exist_request: "GetGroupClaimExistRequest"
    ) -> "GetGroupClaimExistResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_api_key_create(
        self, put_group_api_key_create_request: "PutGroupApiKeyCreateRequest"
    ) -> "PutGroupApiKeyCreateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_api_key_delete(
        self, put_group_api_key_delete_request: "PutGroupApiKeyDeleteRequest"
    ) -> "PutGroupApiKeyDeleteResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_group(
        self, stream: "grpclib.server.Stream[GetGroupRequest, GetGroupResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group(request)
        await stream.send_message(response)

    async def __rpc_get_group_list(
        self, stream: "grpclib.server.Stream[GetGroupListRequest, GetGroupListResponse]"
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_list,
            stream,
            request,
        )

    async def __rpc_get_group_count(
        self,
        stream: "grpclib.server.Stream[GetGroupCountRequest, GetGroupCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_count(request)
        await stream.send_message(response)

    async def __rpc_post_group(
        self, stream: "grpclib.server.Stream[PostGroupRequest, PostGroupResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_group(request)
        await stream.send_message(response)

    async def __rpc_delete_group(
        self, stream: "grpclib.server.Stream[DeleteGroupRequest, DeleteGroupResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_group(request)
        await stream.send_message(response)

    async def __rpc_post_group_by_template(
        self,
        stream: "grpclib.server.Stream[PostGroupByTemplateRequest, PostGroupByTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_group_by_template(request)
        await stream.send_message(response)

    async def __rpc_put_group_user_attach(
        self,
        stream: "grpclib.server.Stream[PutGroupUserAttachRequest, PutGroupUserAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_user_attach(request)
        await stream.send_message(response)

    async def __rpc_put_group_user_detach(
        self,
        stream: "grpclib.server.Stream[PutGroupUserDetachRequest, PutGroupUserDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_user_detach(request)
        await stream.send_message(response)

    async def __rpc_get_group_user_list(
        self,
        stream: "grpclib.server.Stream[GetGroupUserListRequest, GetGroupUserListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_user_list,
            stream,
            request,
        )

    async def __rpc_get_group_user_count(
        self,
        stream: "grpclib.server.Stream[GetGroupUserCountRequest, GetGroupUserCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_user_count(request)
        await stream.send_message(response)

    async def __rpc_get_group_claim_list(
        self,
        stream: "grpclib.server.Stream[GetGroupClaimListRequest, GetGroupClaimListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_claim_list,
            stream,
            request,
        )

    async def __rpc_get_group_claim_count(
        self,
        stream: "grpclib.server.Stream[GetGroupClaimCountRequest, GetGroupClaimCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_claim_count(request)
        await stream.send_message(response)

    async def __rpc_get_group_claim_exist(
        self,
        stream: "grpclib.server.Stream[GetGroupClaimExistRequest, GetGroupClaimExistResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_claim_exist(request)
        await stream.send_message(response)

    async def __rpc_put_group_api_key_create(
        self,
        stream: "grpclib.server.Stream[PutGroupApiKeyCreateRequest, PutGroupApiKeyCreateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_api_key_create(request)
        await stream.send_message(response)

    async def __rpc_put_group_api_key_delete(
        self,
        stream: "grpclib.server.Stream[PutGroupApiKeyDeleteRequest, PutGroupApiKeyDeleteResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_api_key_delete(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.access_management.v1.GroupService/GetGroup": grpclib.const.Handler(
                self.__rpc_get_group,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupRequest,
                GetGroupResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupList": grpclib.const.Handler(
                self.__rpc_get_group_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupListRequest,
                GetGroupListResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupCount": grpclib.const.Handler(
                self.__rpc_get_group_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupCountRequest,
                GetGroupCountResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PostGroup": grpclib.const.Handler(
                self.__rpc_post_group,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostGroupRequest,
                PostGroupResponse,
            ),
            "/keyapis.access_management.v1.GroupService/DeleteGroup": grpclib.const.Handler(
                self.__rpc_delete_group,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteGroupRequest,
                DeleteGroupResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PostGroupByTemplate": grpclib.const.Handler(
                self.__rpc_post_group_by_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostGroupByTemplateRequest,
                PostGroupByTemplateResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PutGroupUserAttach": grpclib.const.Handler(
                self.__rpc_put_group_user_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupUserAttachRequest,
                PutGroupUserAttachResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PutGroupUserDetach": grpclib.const.Handler(
                self.__rpc_put_group_user_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupUserDetachRequest,
                PutGroupUserDetachResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupUserList": grpclib.const.Handler(
                self.__rpc_get_group_user_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupUserListRequest,
                GetGroupUserListResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupUserCount": grpclib.const.Handler(
                self.__rpc_get_group_user_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupUserCountRequest,
                GetGroupUserCountResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupClaimList": grpclib.const.Handler(
                self.__rpc_get_group_claim_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupClaimListRequest,
                GetGroupClaimListResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupClaimCount": grpclib.const.Handler(
                self.__rpc_get_group_claim_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupClaimCountRequest,
                GetGroupClaimCountResponse,
            ),
            "/keyapis.access_management.v1.GroupService/GetGroupClaimExist": grpclib.const.Handler(
                self.__rpc_get_group_claim_exist,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupClaimExistRequest,
                GetGroupClaimExistResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PutGroupApiKeyCreate": grpclib.const.Handler(
                self.__rpc_put_group_api_key_create,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupApiKeyCreateRequest,
                PutGroupApiKeyCreateResponse,
            ),
            "/keyapis.access_management.v1.GroupService/PutGroupApiKeyDelete": grpclib.const.Handler(
                self.__rpc_put_group_api_key_delete,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupApiKeyDeleteRequest,
                PutGroupApiKeyDeleteResponse,
            ),
        }


class GroupTemplateServiceBase(ServiceBase):

    async def get_group_template(
        self, get_group_template_request: "GetGroupTemplateRequest"
    ) -> "GetGroupTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_template_list(
        self, get_group_template_list_request: "GetGroupTemplateListRequest"
    ) -> "AsyncIterator[GetGroupTemplateListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetGroupTemplateListResponse()

    async def get_group_template_count(
        self, get_group_template_count_request: "GetGroupTemplateCountRequest"
    ) -> "GetGroupTemplateCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_group_template(
        self, post_group_template_request: "PostGroupTemplateRequest"
    ) -> "PostGroupTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_group_template(
        self, delete_group_template_request: "DeleteGroupTemplateRequest"
    ) -> "DeleteGroupTemplateResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_group_template_group_list(
        self, get_group_template_group_list_request: "GetGroupTemplateGroupListRequest"
    ) -> "AsyncIterator[GetGroupTemplateGroupListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetGroupTemplateGroupListResponse()

    async def get_group_template_group_count(
        self,
        get_group_template_group_count_request: "GetGroupTemplateGroupCountRequest",
    ) -> "GetGroupTemplateGroupCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_template_group_attach(
        self,
        put_group_template_group_attach_request: "PutGroupTemplateGroupAttachRequest",
    ) -> "PutGroupTemplateGroupAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_group_template_group_detach(
        self,
        put_group_template_group_detach_request: "PutGroupTemplateGroupDetachRequest",
    ) -> "PutGroupTemplateGroupDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_group_template(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateRequest, GetGroupTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_template(request)
        await stream.send_message(response)

    async def __rpc_get_group_template_list(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateListRequest, GetGroupTemplateListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_template_list,
            stream,
            request,
        )

    async def __rpc_get_group_template_count(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateCountRequest, GetGroupTemplateCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_template_count(request)
        await stream.send_message(response)

    async def __rpc_post_group_template(
        self,
        stream: "grpclib.server.Stream[PostGroupTemplateRequest, PostGroupTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_group_template(request)
        await stream.send_message(response)

    async def __rpc_delete_group_template(
        self,
        stream: "grpclib.server.Stream[DeleteGroupTemplateRequest, DeleteGroupTemplateResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_group_template(request)
        await stream.send_message(response)

    async def __rpc_get_group_template_group_list(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateGroupListRequest, GetGroupTemplateGroupListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_group_template_group_list,
            stream,
            request,
        )

    async def __rpc_get_group_template_group_count(
        self,
        stream: "grpclib.server.Stream[GetGroupTemplateGroupCountRequest, GetGroupTemplateGroupCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_group_template_group_count(request)
        await stream.send_message(response)

    async def __rpc_put_group_template_group_attach(
        self,
        stream: "grpclib.server.Stream[PutGroupTemplateGroupAttachRequest, PutGroupTemplateGroupAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_template_group_attach(request)
        await stream.send_message(response)

    async def __rpc_put_group_template_group_detach(
        self,
        stream: "grpclib.server.Stream[PutGroupTemplateGroupDetachRequest, PutGroupTemplateGroupDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_group_template_group_detach(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplate": grpclib.const.Handler(
                self.__rpc_get_group_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupTemplateRequest,
                GetGroupTemplateResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateList": grpclib.const.Handler(
                self.__rpc_get_group_template_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupTemplateListRequest,
                GetGroupTemplateListResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateCount": grpclib.const.Handler(
                self.__rpc_get_group_template_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupTemplateCountRequest,
                GetGroupTemplateCountResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/PostGroupTemplate": grpclib.const.Handler(
                self.__rpc_post_group_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostGroupTemplateRequest,
                PostGroupTemplateResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/DeleteGroupTemplate": grpclib.const.Handler(
                self.__rpc_delete_group_template,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteGroupTemplateRequest,
                DeleteGroupTemplateResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateGroupList": grpclib.const.Handler(
                self.__rpc_get_group_template_group_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetGroupTemplateGroupListRequest,
                GetGroupTemplateGroupListResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/GetGroupTemplateGroupCount": grpclib.const.Handler(
                self.__rpc_get_group_template_group_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetGroupTemplateGroupCountRequest,
                GetGroupTemplateGroupCountResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/PutGroupTemplateGroupAttach": grpclib.const.Handler(
                self.__rpc_put_group_template_group_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupTemplateGroupAttachRequest,
                PutGroupTemplateGroupAttachResponse,
            ),
            "/keyapis.access_management.v1.GroupTemplateService/PutGroupTemplateGroupDetach": grpclib.const.Handler(
                self.__rpc_put_group_template_group_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutGroupTemplateGroupDetachRequest,
                PutGroupTemplateGroupDetachResponse,
            ),
        }


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


rebuild_dataclass(Group)  # type: ignore
rebuild_dataclass(GetGroupResponse)  # type: ignore
rebuild_dataclass(GetGroupResponseError)  # type: ignore
rebuild_dataclass(GetGroupListRequest)  # type: ignore
rebuild_dataclass(GetGroupListResponse)  # type: ignore
rebuild_dataclass(GetGroupListResponseError)  # type: ignore
rebuild_dataclass(GetGroupCountRequest)  # type: ignore
rebuild_dataclass(GetGroupCountResponse)  # type: ignore
rebuild_dataclass(GetGroupCountResponseError)  # type: ignore
rebuild_dataclass(GroupFilter)  # type: ignore
rebuild_dataclass(GroupPaging)  # type: ignore
rebuild_dataclass(PostGroupRequest)  # type: ignore
rebuild_dataclass(PostGroupByTemplateRequest)  # type: ignore
rebuild_dataclass(PostGroupResponse)  # type: ignore
rebuild_dataclass(PostGroupResponseError)  # type: ignore
rebuild_dataclass(PostGroupByTemplateResponse)  # type: ignore
rebuild_dataclass(PostGroupByTemplateResponseError)  # type: ignore
rebuild_dataclass(PutGroupUserAttachRequest)  # type: ignore
rebuild_dataclass(PutGroupUserDetachRequest)  # type: ignore
rebuild_dataclass(GetGroupUserListRequest)  # type: ignore
rebuild_dataclass(GroupUserPaging)  # type: ignore
rebuild_dataclass(GetGroupUserListResponse)  # type: ignore
rebuild_dataclass(GetGroupUserCountRequest)  # type: ignore
rebuild_dataclass(GetGroupClaimCountRequest)  # type: ignore
rebuild_dataclass(GetGroupClaimExistRequest)  # type: ignore
rebuild_dataclass(GetGroupClaimExistResponse)  # type: ignore
rebuild_dataclass(GetGroupClaimExistResponseError)  # type: ignore
rebuild_dataclass(GetGroupClaimListRequest)  # type: ignore
rebuild_dataclass(GetGroupClaimListResponse)  # type: ignore
rebuild_dataclass(GroupClaimFilter)  # type: ignore
rebuild_dataclass(GroupClaimFilterUserData)  # type: ignore
rebuild_dataclass(GroupClaimPaging)  # type: ignore
rebuild_dataclass(GroupTemplate)  # type: ignore
rebuild_dataclass(GetGroupTemplateGroupListRequest)  # type: ignore
rebuild_dataclass(GetGroupTemplateGroupCountRequest)  # type: ignore
rebuild_dataclass(GroupTemplateGroupPaging)  # type: ignore
rebuild_dataclass(GetGroupTemplateGroupListResponse)  # type: ignore
rebuild_dataclass(PutGroupTemplateGroupAttachRequest)  # type: ignore
rebuild_dataclass(PutGroupTemplateGroupDetachRequest)  # type: ignore
rebuild_dataclass(GetGroupTemplateResponse)  # type: ignore
rebuild_dataclass(GetGroupTemplateResponseError)  # type: ignore
rebuild_dataclass(GetGroupTemplateListRequest)  # type: ignore
rebuild_dataclass(GetGroupTemplateListResponse)  # type: ignore
rebuild_dataclass(GetGroupTemplateListResponseError)  # type: ignore
rebuild_dataclass(GetGroupTemplateCountRequest)  # type: ignore
rebuild_dataclass(GetGroupTemplateCountResponse)  # type: ignore
rebuild_dataclass(GetGroupTemplateCountResponseError)  # type: ignore
rebuild_dataclass(GroupTemplatePaging)  # type: ignore
rebuild_dataclass(PostGroupTemplateRequest)  # type: ignore
rebuild_dataclass(PostGroupTemplateResponse)  # type: ignore
rebuild_dataclass(PostGroupTemplateResponseError)  # type: ignore
