datum-agent 0.9.2

Embeddable Datum job registry and lifecycle supervisor
Documentation
//! Datum Control Protocol (DCP) server and client.
//!
//! DCP is a small prost protocol over length-prefixed TCP or QUIC streams. It is
//! intentionally local to `datum-agent`: the registry remains the control-plane
//! owner, while DCP is the management transport used by the upcoming CLI/TUI and
//! cluster work.

pub mod client;
pub mod proto;
pub mod server;

mod frame;

use thiserror::Error;

pub use client::{DcpClient, EventSubscription, MetricSubscription};
pub use proto::{
    Auth, ClientKind, DCP_PROTOCOL_MAJOR, DCP_PROTOCOL_VERSION, DrainJob, GetConfig, Hello,
    JobStatusRequest, ListJobs, PutConfig, Request, Response, ResponseStatus, RestartJob, StartJob,
    StopJob, SubscribeEvents, SubscribeMetrics,
};
pub use server::{
    DcpJobFactories, DcpQuicServerConfig, DcpServer, DcpServerConfig, DcpServerHandle,
    DcpTcpServerConfig,
};

/// Result type used by DCP APIs.
pub type DcpResult<T> = Result<T, DcpError>;

/// Errors returned by DCP clients, servers, and frame codecs.
#[derive(Debug, Error)]
pub enum DcpError {
    #[error("DCP connection closed")]
    Closed,
    #[error("DCP protocol error: {0}")]
    Protocol(String),
    #[error("DCP response {status:?}: {message}")]
    Response {
        status: ResponseStatus,
        message: String,
    },
    #[error("DCP IO error: {0}")]
    Io(#[from] std::io::Error),
    #[error("DCP encode error: {0}")]
    Encode(#[from] prost::EncodeError),
    #[error("DCP decode error: {0}")]
    Decode(#[from] prost::DecodeError),
    #[error("DCP agent error: {0}")]
    Agent(#[from] crate::AgentError),
    #[error("DCP stream error: {0}")]
    Stream(#[from] datum::StreamError),
    #[error("DCP task failed: {0}")]
    Join(#[from] tokio::task::JoinError),
}

impl DcpError {
    pub(crate) fn response(status: ResponseStatus, message: impl Into<String>) -> Self {
        Self::Response {
            status,
            message: message.into(),
        }
    }
}