use std::path::PathBuf;
use std::sync::Arc;
use serde::Deserialize;
use serde_json::Value;
use trusty_common::uds::server::{RpcError, RpcRouter, request_peer};
use crate::daemon::delegation_routes as dg;
use crate::daemon::services::delegation_records::DelegationListing;
use crate::daemon::services::delegation_repair::RepairOutcome;
use crate::daemon::services::delegation_repair_caller::RepairPeer;
use crate::daemon::state::DaemonState;
#[derive(Debug, Deserialize)]
pub struct DispatchParams {
pub id: String,
pub payload: Value,
}
#[derive(Debug, Deserialize)]
pub struct ListParams {
pub cwd: PathBuf,
}
#[derive(Debug, Deserialize)]
pub struct RepairParams {
pub agent_id: String,
#[serde(default)]
pub force: bool,
}
#[derive(Debug, Deserialize)]
pub struct RepairByIdParams {
pub delegation_id: String,
#[serde(default)]
pub force: bool,
}
pub fn register(router: RpcRouter, state: &Arc<DaemonState>) -> RpcRouter {
let held = Arc::clone(state);
let r = router.typed::<DispatchParams, dg::SharedTreeWritersResponse, _, _>(
"mpm.delegation.shared_tree_dispatch",
move |p| {
let s = Arc::clone(&held);
async move {
dg::shared_tree_dispatch_op(
&s,
&p.id,
dg::SharedTreeDispatchRequest { payload: p.payload },
)
.map_err(Into::into)
}
},
);
let held = Arc::clone(state);
let r = r.typed::<DispatchParams, dg::SharedTreeWritersResponse, _, _>(
"mpm.delegation.granted_worktree",
move |p| {
let s = Arc::clone(&held);
async move {
dg::granted_worktree_op(
&s,
&p.id,
dg::SharedTreeDispatchRequest { payload: p.payload },
)
.map_err(Into::into)
}
},
);
register_step_2a(r, state)
}
fn register_step_2a(router: RpcRouter, state: &Arc<DaemonState>) -> RpcRouter {
let held = Arc::clone(state);
let r = router.typed::<ListParams, DelegationListing, _, _>("mpm.delegation.list", move |p| {
let s = Arc::clone(&held);
async move { Ok(dg::list_delegations_op(&s, p.cwd)) }
});
let held = Arc::clone(state);
let r = r.typed::<RepairParams, RepairOutcome, _, _>("mpm.delegation.repair", move |p| {
let s = Arc::clone(&held);
async move {
let peer = RepairPeer::from_socket(request_peer());
Ok::<_, RpcError>(dg::repair_delegation_op(s, p.agent_id, p.force, peer).await)
}
});
let held = Arc::clone(state);
r.typed::<RepairByIdParams, RepairOutcome, _, _>("mpm.delegation.repair_by_id", move |p| {
let s = Arc::clone(&held);
async move {
let peer = RepairPeer::from_socket(request_peer());
dg::repair_delegation_by_id_op(s, &p.delegation_id, p.force, peer)
.await
.map_err(Into::into)
}
})
}