Newer
Older
TIASDataHub / src / tiasdata / kinds / tongue_color.py
"""所見の種類 `tongue_color`(舌色 5 分類+程度)の値の型(SPEC_02「kinds」)."""

from typing import Literal

from pydantic import BaseModel, ConfigDict, model_validator

TongueColorLabel = Literal["pale", "light_red", "red", "dark_red", "purple"]
TongueColorSeverity = Literal["strong", "mild", "normal"]


class TongueColor(BaseModel):
    """舌色の所見の値(`{"label": ..., "severity": ...}`).

    slug は TIASJudgeModel の SPEC_01「クラス定義」と同じ.`normal` は `light_red`(淡紅.正常)
    のときだけで,それ以外の舌色は `strong`(あり)または `mild`(ややあり).

    Attributes:
        label: 舌色(`pale`・`light_red`・`red`・`dark_red`・`purple`).
        severity: 程度(`strong`・`mild`・`normal`).
    """

    # 未知のキーは拒否する(綴りの誤りで値が黙って欠けるのを防ぐ)
    model_config = ConfigDict(extra="forbid", frozen=True, strict=True)

    label: TongueColorLabel
    severity: TongueColorSeverity

    @model_validator(mode="after")
    def _normal_only_for_light_red(self) -> "TongueColor":
        if (self.severity == "normal") != (self.label == "light_red"):
            raise ValueError("severity が normal になるのは label が light_red のときだけ")
        return self