#![cfg_attr(coverage_nightly, coverage(off))]
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use thiserror::Error;
use uuid::Uuid;
pub mod adapters;
pub mod operations;
#[async_trait]
pub trait ProtocolAdapter: Send + Sync {
type Request: for<'de> Deserialize<'de>;
type Response: Serialize;
fn decode(&self, raw: &[u8]) -> Result<UnifiedRequest, ProtocolError>;
fn encode(&self, response: UnifiedResponse) -> Result<Vec<u8>, ProtocolError>;
async fn handle(&self, request: Self::Request) -> Self::Response;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UnifiedRequest {
pub operation: Operation,
pub params: Value,
pub context: RequestContext,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UnifiedResponse {
pub result: Option<Value>,
pub error: Option<ErrorInfo>,
pub metadata: ResponseMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RequestContext {
pub request_id: String,
pub trace_id: Uuid,
pub protocol: String,
pub timestamp: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponseMetadata {
pub request_id: String,
pub duration_ms: u64,
pub version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorInfo {
pub code: i32,
pub message: String,
pub details: Option<Value>,
}
#[derive(Debug, Error)]
pub enum ProtocolError {
#[error("Unknown method: {0}")]
UnknownMethod(String),
#[error("Invalid parameters: {0}")]
InvalidParams(String),
#[error("Serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Operation {
AnalyzeComplexity(ComplexityParams),
AnalyzeSatd(SatdParams),
AnalyzeDeadCode(DeadCodeParams),
GenerateContext(ContextParams),
QualityGate(QualityGateParams),
QualityProxy(QualityProxyParams),
RefactorStart(RefactorStartParams),
RefactorNext(RefactorNextParams),
RefactorStop(RefactorStopParams),
ScaffoldProject(ProjectParams),
ScaffoldAgent(AgentParams),
PdmtTodos(PdmtParams),
}
include!("protocol_params.rs");
include!("protocol_context.rs");
include!("protocol_tests.rs");