|
|
from typing import List, Literal, Annotated, Optional |
|
|
from pydantic import BaseModel, Field, ValidationError, field_validator, conint, StringConstraints |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import sys |
|
|
|
|
|
if sys.version_info >= (3, 11): |
|
|
|
|
|
from enum import StrEnum |
|
|
else: |
|
|
|
|
|
from enum import Enum |
|
|
|
|
|
class StrEnum(str, Enum): |
|
|
"""Compatibility fallback for Python < 3.11.""" |
|
|
pass |
|
|
|
|
|
import base64 |
|
|
from io import BytesIO |
|
|
from PIL import Image |
|
|
|
|
|
class YesNoAnswer(StrEnum): |
|
|
Yes = "Yes" |
|
|
No = "No" |
|
|
|
|
|
class YesNoName(BaseModel): |
|
|
YesNo: YesNoAnswer = Field(description="A Yes or No Answer.") |
|
|
Name: str = Field(default="", description="The name (may be empty).") |
|
|
|
|
|
|
|
|
class YesNoNameList(BaseModel): |
|
|
items: List[YesNoName] |
|
|
|
|
|
|
|
|
|
|
|
class MTGNameOnly(BaseModel): |
|
|
Name: str |
|
|
|
|
|
|
|
|
|
|
|
ManaCost = Optional[ |
|
|
Annotated[str, StringConstraints(pattern=r'^(?:\{(?:[0-9]+|[XRUWGB])\})+$')] |
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
class SubtypeEnum(StrEnum): |
|
|
Legendary = "Legendary" |
|
|
Basic = "Basic" |
|
|
Snow = "Snow" |
|
|
BasicSnow = "Basic, Snow" |
|
|
World = "World" |
|
|
LegendarySnow = "Legendary, Snow" |
|
|
Host = "Host" |
|
|
Ongoing = "Ongoing" |
|
|
NoneType = "None" |
|
|
|
|
|
class MTGCard(BaseModel): |
|
|
|
|
|
Name: str |
|
|
Supertype: Optional[SubtypeEnum] = None |
|
|
Type: str |
|
|
Subtype: str |
|
|
Keywords: str |
|
|
Text: str |
|
|
FlavorText: Optional[str] = "" |
|
|
|
|
|
|
|
|
Colors: Optional[List[Literal['R', 'U', 'W', 'G', 'B']]] = None |
|
|
ManaCost: ManaCost |
|
|
|
|
|
|
|
|
Power: Optional[conint(gt=0)] = None |
|
|
Toughness: Optional[conint(gt=0)] = None |
|
|
|
|
|
|
|
|
class MTGCardList(BaseModel): |
|
|
Name: str = Field(description="A short descriptive name for the newly generated set of MTG cards.") |
|
|
cards: List[MTGCard] |
|
|
explanation: str |