Source code for byte_api.lib.types

"""Library module for type definitions to be used in the application."""

from __future__ import annotations

from typing import TYPE_CHECKING, Any, Literal, TypeVar

from advanced_alchemy.extensions.litestar import SQLAlchemyDTO
from advanced_alchemy.filters import FilterTypes
from litestar.dto import DataclassDTO, DTOData
from litestar.types import DataclassProtocol
from sqlalchemy.orm import DeclarativeBase

if TYPE_CHECKING:
    from advanced_alchemy.service import SQLAlchemyAsyncRepositoryService
    from pydantic import BaseModel

# -- Database Types
SQLAlchemyModelT = TypeVar("SQLAlchemyModelT", bound=DeclarativeBase)
"""Type variable for SQLAlchemy models."""
SQLAlchemyAsyncRepoServiceT = TypeVar("SQLAlchemyAsyncRepoServiceT", bound="SQLAlchemyAsyncRepositoryService")
"""Type variable for SQLAlchemy async repository services."""
DataclassModelT = TypeVar("DataclassModelT", bound=DataclassProtocol)
"""Type variable for dataclass models."""
type ModelT[SQLAlchemyModelT: DeclarativeBase, DataclassModelT: DataclassProtocol] = SQLAlchemyModelT | DataclassModelT
"""Type alias for models."""
FilterTypeT = TypeVar("FilterTypeT", bound=FilterTypes)
"""Type variable for filter types."""

# -- DTO Types
ModelDTOT = TypeVar("ModelDTOT", bound="BaseModel")
"""Type variable for models."""
DTOT = TypeVar("DTOT", bound=DataclassProtocol | DeclarativeBase)
"""Type variable for DTOs."""
DTOFactoryT = TypeVar("DTOFactoryT", bound=DataclassDTO | SQLAlchemyDTO)
"""Type variable for DTO factories."""
type ModelDictDTOT = dict[str, Any] | ModelT | DTOData
"""Type alias for model or dict DTOs."""
type ModelDictListDTOT[SQLAlchemyModelT: DeclarativeBase, DataclassModelT: DataclassProtocol] = (
    list[SQLAlchemyModelT | DataclassModelT | dict[str, Any]] | DTOData
)
"""Type alias for list of models, dicts, or DTOData."""

# -- App Types
type Status = Literal["online", "offline", "degraded"]
"""Type alias for health check status."""