# `config`モジュールの設計

`config`モジュールは、`haniwers v1`における設定管理の中核を担うモジュールです。
TOML形式の設定ファイルを型安全に読み込むためのスキーマ定義とローダー機能を提供します。
設定ファイルに基づくCLI操作を可能にするための基盤として機能します。

## 実装したモジュール／クラス

1. `config/model.py`: モデルの定義とファイル読み込みを担当するモジュールです
2. `config/loader.py`: 設定ファイルの探索、CLIとの統合を担当するモジュールです
3. `config/generator.py`: 設定ファイルの生成を担当するモジュールです

## データモデルの定義（`pydantic.BaseModel`を継承）

1. `DeviceConfig`: シリアル接続の設定を管理
2. `SensorConfig`: MPPCの設定を管理
3. `DaqConfig`: DAQの設定を管理
4. `ScanConfig`: スレッショルドスキャンの設定を管理
5. `HaniwersConfig`: 上記の設定を集約するトップレベルの設定管理クラス

## TOMLファイルの読み込みロジック

1. `HaniwersConfig.from_toml(file_path: Path)`
    - 指定されたTOMLファイルを読み込み、構文と型の両面で検証（validate）した上で、インスタンスを生成します
    - TOMLには`none`や`null`のネイティブな表現がないため、便宜上、設定値に文字列`"none"`を使い、読み込む時の変換処理を明示的に実装しています
2. `load_config(file_path: Path)`
    - 上記の外部インターフェイス

## 設計方針

:責務の明確化:
`config/model.py`はモデル定義とファイル読み込みのロジックのみを任せることにしました。設定ファイルの検出は`config/loader.py`に委譲しました。

:バリデーション重視:
`pydantic`を使って、型情報・型制約を強制することにしました。
これにより誤った値での設定を未然に防止します。

:センサー設定の個別管理:
`v0`では難しかったセンサーごとの設定を、個別に管理できるようにしました。
`sensors: dict[str, SensorConfig]`と定義してあり、
それぞれのセンサーに名前をつけて、連想配列として管理できます。

:CLIモードとの対応:
`v0`のCLIと同じようなインターフェイスを想定して、
設定ファイルのセクションを定義しました。

## ユースケース

```python
from haniwers.config.model import load_config

cfg = load_config(Path("config.toml"))

device = cfg.device
sensors = cfg.sensors
daq = cfg.daq
scan = cfg.scan
```

## 今後の拡張候補

- `.validate()`や`.patch()`による外部オプションの反映
- JSON Schemaのエクスポートによるエディタ補完の対応
- 複数の設定プロファイルの切り替え
