# core/result.py from dataclasses import dataclass, field @dataclass class StepResult: step: str # "validate" | "clean" | "convert" | ... changed: bool details: list = field(default_factory=list) # e.g. ["Eliminado: thumbs.db"] warnings: list = field(default_factory=list) errors: list = field(default_factory=list) @dataclass class ComicResult: original_path: str final_path: str | None # None si se abortó steps: list = field(default_factory=list) def ok(self) -> bool: return all(not s.errors for s in self.steps) def summary(self) -> str: if not self.ok(): errors = [e for s in self.steps for e in s.errors] return f"ERROR [{self.original_path}]: {'; '.join(errors)}" changed_steps = [s.step for s in self.steps if s.changed] if changed_steps: dest = self.final_path or self.original_path return f"OK [{self.original_path}] → {dest} ({', '.join(changed_steps)})" return f"OK [{self.original_path}] (sin cambios)" def has_issues(self) -> bool: """True si algún step tiene warnings o errors.""" return any(s.warnings or s.errors for s in self.steps) def full_report(self) -> str: lines = [f"Cómic: {self.original_path}"] for s in self.steps: status = "CAMBIADO" if s.changed else "sin cambios" lines.append(f" [{s.step}] {status}") for d in s.details: lines.append(f" - {d}") for w in s.warnings: lines.append(f" AVISO: {w}") for e in s.errors: lines.append(f" ERROR: {e}") if self.final_path: lines.append(f" Resultado final: {self.final_path}") return "\n".join(lines)