Rust: тонкий актор-обёртка над FFI (tokio) #7

Open
opened 2026-06-15 13:22:21 +02:00 by yorunikakeru · 0 comments
Owner

Создать Rust крейт planner-actor — тонкую tokio-обёртку над Haskell ядром.

Структура

planner-actor/
  Cargo.toml
  build.rs        -- линкует libHSplanner-core.so
  src/
    lib.rs
    ffi.rs          -- extern "C" объявления hs_plan, hs_planner_init
    actor.rs        -- PlannerActor, run loop
    messages.rs     -- PlannerMsg enum

Каналы (из spec)

pub enum PlannerMsg {
    NewConfig(Bytes),           // новый IRDocument (opaque JSON bytes)
    SystemStateUpdate(Bytes),   // новый SystemState от Watcher
}
  • Входящие: mpsc::Receiver<PlannerMsg>
  • Исходящие план: mpsc::Sender<Plan> → Executor
  • Store commit/rollback: mpsc::Sender<StoreMsg>

Actor loop

async fn run(mut rx: mpsc::Receiver<PlannerMsg>, ...) {
    let mut current_ir: Option<Bytes> = None;
    let mut current_state: Option<Bytes> = None;
    while let Some(msg) = rx.recv().await {
        match msg {
            NewConfig(ir) => { current_ir = Some(ir); replan(...) }
            SystemStateUpdate(s) => { current_state = Some(s); replan(...) }
        }
    }
}

Acceptance

  • cargo build с линкованной .so без ошибок
  • Актор стартует, принимает сообщения, не паникует на пустом IR
Создать Rust крейт `planner-actor` — тонкую tokio-обёртку над Haskell ядром. ## Структура ``` planner-actor/ Cargo.toml build.rs -- линкует libHSplanner-core.so src/ lib.rs ffi.rs -- extern "C" объявления hs_plan, hs_planner_init actor.rs -- PlannerActor, run loop messages.rs -- PlannerMsg enum ``` ## Каналы (из spec) ```rust pub enum PlannerMsg { NewConfig(Bytes), // новый IRDocument (opaque JSON bytes) SystemStateUpdate(Bytes), // новый SystemState от Watcher } ``` - Входящие: `mpsc::Receiver<PlannerMsg>` - Исходящие план: `mpsc::Sender<Plan>` → Executor - Store commit/rollback: `mpsc::Sender<StoreMsg>` ## Actor loop ```rust async fn run(mut rx: mpsc::Receiver<PlannerMsg>, ...) { let mut current_ir: Option<Bytes> = None; let mut current_state: Option<Bytes> = None; while let Some(msg) = rx.recv().await { match msg { NewConfig(ir) => { current_ir = Some(ir); replan(...) } SystemStateUpdate(s) => { current_state = Some(s); replan(...) } } } } ``` ## Acceptance - `cargo build` с линкованной .so без ошибок - Актор стартует, принимает сообщения, не паникует на пустом IR
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#7
No description provided.