use std::sync::Arc;
use chio_core_types::{PlanEvaluationRequest, PlanEvaluationResponse};
use chio_kernel::ChioKernel;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum PlanHandlerError {
BadRequest(String),
}
impl PlanHandlerError {
#[must_use]
pub fn status(&self) -> u16 {
match self {
Self::BadRequest(_) => 400,
}
}
#[must_use]
pub fn code(&self) -> &'static str {
match self {
Self::BadRequest(_) => "bad_request",
}
}
#[must_use]
pub fn message(&self) -> String {
match self {
Self::BadRequest(reason) => reason.clone(),
}
}
#[must_use]
pub fn body(&self) -> serde_json::Value {
serde_json::json!({
"error": self.code(),
"message": self.message(),
})
}
}
pub fn handle_evaluate_plan(
kernel: &Arc<ChioKernel>,
body: &[u8],
) -> Result<PlanEvaluationResponse, PlanHandlerError> {
let parsed: PlanEvaluationRequest = serde_json::from_slice(body).map_err(|error| {
PlanHandlerError::BadRequest(format!("invalid evaluate-plan request body: {error}"))
})?;
Ok(kernel.evaluate_plan_blocking(&parsed))
}