81 lines
2 KiB
Python
81 lines
2 KiB
Python
|
|
"""Structured error and warning types for markidocx (FR-1201–1210)."""
|
|||
|
|
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
from dataclasses import dataclass
|
|||
|
|
from enum import StrEnum
|
|||
|
|
from typing import Any
|
|||
|
|
|
|||
|
|
|
|||
|
|
class Severity(StrEnum):
|
|||
|
|
INFO = "info"
|
|||
|
|
WARNING = "warning"
|
|||
|
|
ERROR = "error"
|
|||
|
|
|
|||
|
|
|
|||
|
|
class OutputState(StrEnum):
|
|||
|
|
"""Lifecycle state of a build/import/workflow result (FR-1210)."""
|
|||
|
|
|
|||
|
|
FINAL = "final"
|
|||
|
|
PARTIAL = "partial"
|
|||
|
|
FALLBACK = "fallback"
|
|||
|
|
DEGRADED = "degraded"
|
|||
|
|
UNRESOLVED = "unresolved"
|
|||
|
|
|
|||
|
|
|
|||
|
|
@dataclass
|
|||
|
|
class WarningRecord:
|
|||
|
|
"""Structured warning record (FR-1208).
|
|||
|
|
|
|||
|
|
severity: info | warning | error
|
|||
|
|
reason: FR-code-aligned description
|
|||
|
|
construct: the token/element that triggered the warning
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
severity: str
|
|||
|
|
reason: str
|
|||
|
|
construct: str = ""
|
|||
|
|
|
|||
|
|
def to_dict(self) -> dict[str, Any]:
|
|||
|
|
return {
|
|||
|
|
"severity": self.severity,
|
|||
|
|
"reason": self.reason,
|
|||
|
|
"construct": self.construct,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def __str__(self) -> str:
|
|||
|
|
if self.construct:
|
|||
|
|
return f"[{self.severity}] {self.reason}: {self.construct}"
|
|||
|
|
return f"[{self.severity}] {self.reason}"
|
|||
|
|
|
|||
|
|
|
|||
|
|
@dataclass
|
|||
|
|
class FailureRecord:
|
|||
|
|
"""Structured failure record (FR-1209).
|
|||
|
|
|
|||
|
|
severity: info | warning | error
|
|||
|
|
reason: FR-code-aligned description
|
|||
|
|
construct: the element that caused the failure
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
severity: str
|
|||
|
|
reason: str
|
|||
|
|
construct: str = ""
|
|||
|
|
|
|||
|
|
def to_dict(self) -> dict[str, Any]:
|
|||
|
|
return {
|
|||
|
|
"severity": self.severity,
|
|||
|
|
"reason": self.reason,
|
|||
|
|
"construct": self.construct,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def __str__(self) -> str:
|
|||
|
|
if self.construct:
|
|||
|
|
return f"[{self.severity}] {self.reason}: {self.construct}"
|
|||
|
|
return f"[{self.severity}] {self.reason}"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def warning_records_to_strings(records: list[WarningRecord]) -> list[str]:
|
|||
|
|
"""Convert a list of WarningRecords to plain strings (backward compat helper)."""
|
|||
|
|
return [str(r) for r in records]
|