Read status file with corruption recovery. Returns: DaemonStatus object (or default if corrupted)
()
| 112 | |
| 113 | |
| 114 | def read_status_file_safe() -> DaemonStatus: |
| 115 | """Read status file with corruption recovery. |
| 116 | |
| 117 | Returns: |
| 118 | DaemonStatus object (or default if corrupted) |
| 119 | """ |
| 120 | default_status = DaemonStatus( |
| 121 | state=DaemonState.IDLE, |
| 122 | message="", |
| 123 | updated_at=time.time(), |
| 124 | ) |
| 125 | |
| 126 | if not STATUS_FILE.exists(): |
| 127 | return default_status |
| 128 | |
| 129 | try: |
| 130 | with open(STATUS_FILE, "r") as f: |
| 131 | data = json.load(f) |
| 132 | |
| 133 | # Parse into typed DaemonStatus |
| 134 | return DaemonStatus.from_dict(data) |
| 135 | |
| 136 | except (json.JSONDecodeError, ValueError) as e: |
| 137 | logging.warning(f"Corrupted status file detected: {e}") |
| 138 | logging.warning("Creating fresh status file") |
| 139 | |
| 140 | # Write fresh status file |
| 141 | write_status_file_atomic(default_status.to_dict()) |
| 142 | |
| 143 | return default_status |
| 144 | except KeyboardInterrupt as ki: |
| 145 | handle_keyboard_interrupt(ki) |
| 146 | raise |
| 147 | except Exception as e: |
| 148 | logging.error(f"Unexpected error reading status file: {e}") |
| 149 | write_status_file_atomic(default_status.to_dict()) |
| 150 | return default_status |
| 151 | |
| 152 | |
| 153 | def write_status_file_atomic(status: dict[str, Any]) -> None: |
no test coverage detected