FFI boundary: migrate JSON byte buffers to Protobuf #11

Open
opened 2026-06-16 17:04:04 +02:00 by yorunikakeru · 0 comments
Owner

Контекст

Сейчас значения через FFI-границу (Haskell ↔ Rust) передаются как версионированные JSON byte buffers (Aeson на Haskell, serde_json на Rust). JSON читаемый, но медленный — текстовый парсинг на каждом вызове.

Что сделать

Заменить JSON на Protobuf:

  • .proto-файлы становятся source of truth для контракта между Planner и Rust runtime
  • Haskell сторона: proto-lens
  • Rust сторона: prost

Схемы

Нужны .proto-определения для:

  • SystemState (input: Rust → Haskell)
  • Plan (output: Haskell → Rust)
  • PlanError (output: Haskell → Rust)

Версионирование

Версионирование через proto field numbering + reserved для удалённых полей. Убрать ручные version-поля из типов после миграции.

Что убрать

  • ToJSON/FromJSON инстансы для SystemState, Plan, PlanError, PlanStep, Undo из Planner.Types
  • Зависимость aeson из planner-core (если не нужна для чего-то ещё)

Замечания

  • Action в IR уже имеет Aeson инстансы — не трогать, это не FFI
  • FFI C ABI остаётся прежним (pointer + length), меняется только содержимое буфера
  • Добавить round-trip тесты для proto encode/decode перед удалением JSON тестов
  • Обновить CHANGELOG.md (смена формата FFI = contract change)
## Контекст Сейчас значения через FFI-границу (Haskell ↔ Rust) передаются как версионированные JSON byte buffers (Aeson на Haskell, serde_json на Rust). JSON читаемый, но медленный — текстовый парсинг на каждом вызове. ## Что сделать Заменить JSON на Protobuf: - `.proto`-файлы становятся source of truth для контракта между Planner и Rust runtime - Haskell сторона: [`proto-lens`](https://hackage.haskell.org/package/proto-lens) - Rust сторона: [`prost`](https://crates.io/crates/prost) ### Схемы Нужны `.proto`-определения для: - `SystemState` (input: Rust → Haskell) - `Plan` (output: Haskell → Rust) - `PlanError` (output: Haskell → Rust) ### Версионирование Версионирование через proto field numbering + `reserved` для удалённых полей. Убрать ручные `version`-поля из типов после миграции. ### Что убрать - `ToJSON`/`FromJSON` инстансы для `SystemState`, `Plan`, `PlanError`, `PlanStep`, `Undo` из `Planner.Types` - Зависимость `aeson` из `planner-core` (если не нужна для чего-то ещё) ## Замечания - `Action` в IR уже имеет Aeson инстансы — не трогать, это не FFI - FFI C ABI остаётся прежним (pointer + length), меняется только содержимое буфера - Добавить round-trip тесты для proto encode/decode перед удалением JSON тестов - Обновить CHANGELOG.md (смена формата FFI = contract change)
Sign in to join this conversation.
No labels
core
ffi
haskell
rust
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
FrogOS/Planner#11
No description provided.