"""所見の種類 `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