from enum import StrEnum from typing import Annotated from pydantic import BaseModel, StringConstraints, field_validator class Status(StrEnum): TO_READ = "to-read" READING = "reading" DONE = "done" class Book(BaseModel): id: int title: str author: str | None = None status: Status class BookCreate(BaseModel): title: Annotated[str, StringConstraints(strip_whitespace=True, min_length=1, max_length=200)] author: Annotated[str, StringConstraints(strip_whitespace=True, max_length=200)] | None = None status: Status = Status.TO_READ @field_validator("author") @classmethod def blank_author_is_none(cls, value: str | None) -> str | None: return value or None class BookStatusUpdate(BaseModel): status: Status class BookStats(BaseModel): total: int by_status: dict[Status, int]