routa-server 0.2.10

Routa.js HTTP Server — axum adapter on top of routa-core
Documentation
use axum::{
    extract::{Query, State},
    routing::get,
    Json, Router,
};
use serde::Deserialize;

use crate::error::ServerError;
use crate::state::AppState;

pub fn router() -> Router<AppState> {
    Router::new().route("/", get(list_skills).post(reload_skills))
}

#[derive(Debug, Deserialize)]
struct ListSkillsQuery {
    name: Option<String>,
}

async fn list_skills(
    State(state): State<AppState>,
    Query(query): Query<ListSkillsQuery>,
) -> Result<Json<serde_json::Value>, ServerError> {
    if let Some(name) = &query.name {
        let skill = state.skill_registry.get_skill(name);
        return Ok(Json(serde_json::json!({ "skill": skill })));
    }

    let skills = state.skill_registry.list_skills();
    Ok(Json(serde_json::json!({ "skills": skills })))
}

async fn reload_skills(
    State(state): State<AppState>,
) -> Result<Json<serde_json::Value>, ServerError> {
    let cwd = std::env::current_dir()
        .map(|p| p.to_string_lossy().to_string())
        .unwrap_or_else(|_| ".".to_string());
    state.skill_registry.reload(&cwd);
    let skills = state.skill_registry.list_skills();
    Ok(Json(
        serde_json::json!({ "skills": skills, "reloaded": true }),
    ))
}