1.8 KiB
1.8 KiB
protocol: JSONL ストリーム変換ユーティリティ
背景
protocol クレートは現在型定義のみ。JSONL の読み書き処理(BufReader + lines + デシリアライズ / シリアライズ + \n + write_all)が socket_server.rs と client.rs で重複している。空行スキップやエラー変換のロジックも各所にベタ書き。
方針
protocol::stream モジュールに JsonLineReader / JsonLineWriter を追加し、JSONL 変換を protocol クレートの責務に含める。
// protocol::stream
pub struct JsonLineReader<R> { /* BufReader<R> */ }
pub struct JsonLineWriter<W> { /* W */ }
impl<R: AsyncBufRead + Unpin> JsonLineReader<R> {
pub fn new(reader: R) -> Self;
pub async fn next<T: DeserializeOwned>(&mut self) -> Result<Option<T>, Error>;
}
impl<W: AsyncWrite + Unpin> JsonLineWriter<W> {
pub fn new(writer: W) -> Self;
pub async fn write<T: Serialize>(&mut self, value: &T) -> Result<(), Error>;
}
設計ポイント
- feature gate にはしない。このプロジェクトで protocol を tokio なしで使う場面がない
- tokio の依存は
io-utilのみ(AsyncBufRead,AsyncWriteに必要な最小限) - 空行スキップ、改行付与、serde エラーの IO エラー変換を一箇所に集約
JsonLineReaderは内部でBufReaderを持つ。呼び出し側でBufReaderを作る必要がない
変更対象
crates/protocol/Cargo.toml— tokio (io-util) 依存を追加crates/protocol/src/stream.rs— 新規モジュールcrates/protocol/src/lib.rs—pub mod streamcrates/pod/src/socket_server.rs—JsonLineReader/JsonLineWriterに置き換えcrates/tui/src/client.rs— 同上crates/pod/tests/controller_test.rs— テストのストリーム処理も置き換え