# Generated by oapi-gen 0.1.9. DO NOT EDIT.
# Source SHA256: 3bdca241e5ef74b0620c69faa4a6e49f171c0542f987ae89044b07b922113dc4
from __future__ import annotations

from collections.abc import AsyncIterable
from dataclasses import dataclass
from typing import Annotated, Literal, Protocol

from msgspec import Meta

from .models import Cat as _models_Cat


@dataclass(frozen=True, slots=True)
class DeviceSecurity:
    "Deprecated security scheme.\n\nOAuth2 metadata: https://example.com/.well-known/oauth-authorization-server"

    token: str
    scopes: tuple[str, ...]


class SecurityRejected(Exception):
    """Signal that one security alternative was not accepted."""


class SecurityHandler(Protocol):
    async def handle_device(
        self, context: object | None, operation_id: str, credential: DeviceSecurity
    ) -> object | None: ...


class WatchCats:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Event:
        "A server-sent event."

        data: _models_Cat
        event: Literal["cat.updated"]
        id: str | None = None
        retry: Annotated[int, Meta(ge=0)] | None = None

    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        last_event_id: str | None
        security_context: object | None

    @dataclass(frozen=True, slots=True)
    class Ok:
        "Cat changes"

        body: AsyncIterable[WatchCats.Event]

    @dataclass(slots=True)
    class Forbidden(Exception):
        "Access denied"

        pass

    type Response = Ok


class ExportCats:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        pass

    @dataclass(frozen=True, slots=True)
    class Ok:
        body: AsyncIterable[_models_Cat]

    type Response = Ok


class ExportCatsNdjson:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        pass

    @dataclass(frozen=True, slots=True)
    class Ok:
        body: AsyncIterable[_models_Cat]

    type Response = Ok


class ExportCatsSequence:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        pass

    @dataclass(frozen=True, slots=True)
    class Ok:
        body: AsyncIterable[_models_Cat]

    type Response = Ok


class CatsHandler(Protocol):
    async def watch_cats(self, request: WatchCats.Request) -> WatchCats.Response: ...
    async def export_cats(self, request: ExportCats.Request) -> ExportCats.Response: ...
    async def export_cats_ndjson(
        self, request: ExportCatsNdjson.Request
    ) -> ExportCatsNdjson.Response: ...
    async def export_cats_sequence(
        self, request: ExportCatsSequence.Request
    ) -> ExportCatsSequence.Response: ...


@dataclass(frozen=True, slots=True, kw_only=True)
class Handlers:
    cats: CatsHandler
