use std::sync::Arc;
use serde::Deserialize;
use trusty_common::uds::server::RpcRouter;
use crate::daemon::manager::{
ActRequest, ActResponse, ChatReplyBody, ChatRequestBody, ManagerVersionResponse,
PortfolioStatusResponse, RouteTaskRequest, RouteTaskResponse, act, chat, digest, route_task,
status, version,
};
use crate::daemon::state::DaemonState;
use super::NoParams;
#[derive(Debug, Default, Deserialize)]
pub struct DigestParams {
#[serde(default)]
pub scope: Option<String>,
}
pub fn register(router: RpcRouter, state: &Arc<DaemonState>) -> RpcRouter {
let held = Arc::clone(state);
let r =
router.typed::<NoParams, ManagerVersionResponse, _, _>("mpm.manager.version", move |_| {
let s = Arc::clone(&held);
async move { Ok(version::version_op(&s)) }
});
let held = Arc::clone(state);
let r = r.typed::<NoParams, PortfolioStatusResponse, _, _>("mpm.manager.status", move |_| {
let s = Arc::clone(&held);
async move { status::load_portfolio_status(&s).await.map_err(Into::into) }
});
let held = Arc::clone(state);
let r = r.typed::<Option<DigestParams>, digest::DigestResponse, _, _>(
"mpm.manager.digest",
move |p| {
let s = Arc::clone(&held);
async move {
let scope = p.unwrap_or_default().scope;
digest::digest_op(&s, digest::DigestQuery { scope })
.await
.map(digest::DigestOutcome::into_body)
.map_err(Into::into)
}
},
);
let held = Arc::clone(state);
let r = r.typed::<ChatRequestBody, ChatReplyBody, _, _>("mpm.manager.chat", move |p| {
let s = Arc::clone(&held);
async move { chat::chat_op(&s, p).await.map_err(Into::into) }
});
let held = Arc::clone(state);
let r =
r.typed::<RouteTaskRequest, RouteTaskResponse, _, _>("mpm.manager.route_task", move |p| {
let s = Arc::clone(&held);
async move { route_task::route_task_op(&s, p).await.map_err(Into::into) }
});
let held = Arc::clone(state);
r.typed::<ActRequest, ActResponse, _, _>("mpm.manager.act", move |p| {
let s = Arc::clone(&held);
async move { act::act_op(&s, p).await.map_err(Into::into) }
})
}