b7d9d7abd9
DaemonEngine: implementación del trait Engine que delega a otro proceso vía Unix socket. Materializa el patrón horizontal de sandokan (el binario que arranca primero expone el engine; los demás se le suman). - protocol.rs — DaemonRequest/DaemonResponse (espejan los métodos de Engine) + framing postcard length-prefixed (u32 LE + bytes), con MAX_FRAME 16 MiB defensivo. - client.rs — DaemonEngine: stateless, un round-trip por llamada; is_reachable() para el probe de auto(). - server.rs — serve(engine, socket): envuelve cualquier Engine, una task por conexión, multi-request por conexión. EngineError ahora es Serialize/Deserialize (viaja por el wire); NotFound se propaga tipado a través del socket. 1 test de integración: roundtrip real DaemonEngine ↔ serve ↔ LocalEngine (list vacío + NotFound propagado). cargo check --workspace verde. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
33 lines
1021 B
Rust
33 lines
1021 B
Rust
//! Errores del orquestador.
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
use ulid::Ulid;
|
|
|
|
/// Falla de una operación del `Engine`. Las impls concretas mapean sus
|
|
/// errores internos (encarnación, IPC, SSH) a estas variantes.
|
|
///
|
|
/// Es `Serialize`/`Deserialize` porque viaja por el wire del
|
|
/// `DaemonEngine` (postcard sobre Unix socket).
|
|
#[derive(Debug, Clone, thiserror::Error, Serialize, Deserialize)]
|
|
pub enum EngineError {
|
|
/// No existe ninguna entidad activa con ese `card_id`.
|
|
#[error("card `{0}` no encontrada")]
|
|
NotFound(Ulid),
|
|
|
|
/// La encarnación falló (clone/namespaces/exec).
|
|
#[error("encarnación falló: {0}")]
|
|
Incarnate(String),
|
|
|
|
/// Falla de transporte (Unix socket del daemon, túnel SSH).
|
|
#[error("transporte: {0}")]
|
|
Transport(String),
|
|
|
|
/// La intención es inconsistente (Card inválida, contexto imposible).
|
|
#[error("intención inválida: {0}")]
|
|
InvalidIntent(String),
|
|
|
|
/// La operación excedió su deadline.
|
|
#[error("timeout")]
|
|
Timeout,
|
|
}
|