40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import json
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
from .models import AgentState
|
||
|
|
|
||
|
|
|
||
|
|
class StateStore:
|
||
|
|
def __init__(self, state_file: str) -> None:
|
||
|
|
self.path = Path(state_file)
|
||
|
|
self.path.parent.mkdir(parents=True, exist_ok=True)
|
||
|
|
|
||
|
|
def load(self, vehicle_id: str, vin: str, current_release: str) -> AgentState:
|
||
|
|
if not self.path.exists() or self._is_empty_file():
|
||
|
|
state = AgentState(vehicle_id=vehicle_id, vin=vin, current_release=current_release)
|
||
|
|
self.save(state)
|
||
|
|
return state
|
||
|
|
|
||
|
|
try:
|
||
|
|
raw = json.loads(self.path.read_text(encoding="utf-8"))
|
||
|
|
except json.JSONDecodeError:
|
||
|
|
state = AgentState(vehicle_id=vehicle_id, vin=vin, current_release=current_release)
|
||
|
|
self.save(state)
|
||
|
|
return state
|
||
|
|
|
||
|
|
raw["vehicle_id"] = vehicle_id
|
||
|
|
raw["vin"] = vin
|
||
|
|
raw["current_release"] = current_release
|
||
|
|
return AgentState(**raw)
|
||
|
|
|
||
|
|
def save(self, state: AgentState) -> None:
|
||
|
|
self.path.write_text(
|
||
|
|
state.model_dump_json(indent=2),
|
||
|
|
encoding="utf-8",
|
||
|
|
)
|
||
|
|
|
||
|
|
def _is_empty_file(self) -> bool:
|
||
|
|
return self.path.stat().st_size == 0
|