diff --git a/geiger_counter_visualizer/src/geiger_counter_visualizer/cli.py b/geiger_counter_visualizer/src/geiger_counter_visualizer/cli.py new file mode 100644 index 0000000..38f80cd --- /dev/null +++ b/geiger_counter_visualizer/src/geiger_counter_visualizer/cli.py @@ -0,0 +1,65 @@ +import argparse +import json +import sys +from pathlib import Path +from typing import List +from geiger_counter_visualizer import core + + +def _load_data(input_path: Path) -> List[core.DataPoint]: + """Lädt und validiert Geigerzählerdaten aus einer JSON-Datei.""" + if not input_path.exists() or not input_path.is_file(): + raise FileNotFoundError(f"Eingabedatei '{input_path}' wurde nicht gefunden.") + + with input_path.open(encoding="utf-8") as f: + try: + raw = json.load(f) + except json.JSONDecodeError as e: + raise ValueError(f"Fehler beim Parsen der JSON-Datei: {e}") from e + + if not isinstance(raw, list): + raise TypeError("Erwartete eine Liste von Datenobjekten im JSON-Root.") + + datapoints = [] + for item in raw: + if not isinstance(item, dict): + raise TypeError("Jedes Item der Datenliste muss ein Objekt (dict) sein.") + try: + dp = core.DataPoint( + timestamp=item["timestamp"], + count=int(item["count"]), + frequency=float(item["frequency"]) + ) + except (KeyError, ValueError, TypeError) as e: + raise ValueError(f"Ungültige Datenstruktur in Eintrag: {item}") from e + datapoints.append(dp) + + assert datapoints, "Es wurden keine gültigen Datenpunkte geladen." + return datapoints + + +def main() -> None: + """CLI-Einstiegspunkt für die Geigerzähler-Visualisierung.""" + parser = argparse.ArgumentParser( + description="Visualisiert Geigerzählerdaten aus einer JSON-Datei in Echtzeit." + ) + parser.add_argument( + "--input", + required=True, + help="Pfad zur JSON-Datei mit Geigerzählerdaten zur Visualisierung." + ) + + args = parser.parse_args() + + input_path = Path(args.input) + try: + data = _load_data(input_path) + print(f"{len(data)} Datenpunkte erfolgreich geladen. Starte Visualisierung...") + core.visualize_data(data) + except Exception as exc: + print(f"Fehler: {exc}", file=sys.stderr) + sys.exit(1) + + +if __name__ == "__main__": + main()