#![cfg_attr(coverage_nightly, coverage(off))]
use anyhow::Result;
use std::sync::Arc;
use tokio::sync::RwLock;
#[allow(dead_code)]
pub struct AgentRouter {
handlers: Arc<RwLock<Vec<Box<dyn Handler>>>>,
circuit_breaker: CircuitBreaker,
}
#[async_trait::async_trait]
pub trait Handler: Send + Sync {
async fn handle(&self, request: &AgentRequest) -> Result<AgentResponse>;
fn protocol(&self) -> Protocol;
}
#[derive(Debug, Clone)]
pub struct AgentRequest {
pub id: String,
pub protocol: Protocol,
pub payload: serde_json::Value,
}
#[derive(Debug, Clone)]
pub struct AgentResponse {
pub request_id: String,
pub success: bool,
pub result: serde_json::Value,
}
#[derive(Debug, Clone)]
pub struct RouteDecision {
pub request: AgentRequest,
pub handler_index: usize,
}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub struct CircuitBreaker {
pub failure_threshold: u32,
pub reset_timeout: u64,
state: Arc<RwLock<CircuitState>>,
}
#[derive(Debug, Clone)]
enum CircuitState {
Closed,
#[allow(dead_code)]
Open,
#[allow(dead_code)]
HalfOpen,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Protocol {
AgentsMd,
Mcp,
Http,
WebSocket,
}
include!("router_routing.rs");
include!("router_tests.rs");