use std::sync::Arc;
use serde::Deserialize;
use trusty_common::uds::server::RpcRouter;
use crate::daemon::api::deliverable_routes as dl;
use crate::daemon::state::DaemonState;
use crate::deliverable::{Deliverable, DeliverableStatus, Milestone};
#[derive(Debug, Deserialize)]
pub struct ProjectParams {
pub project: String,
}
#[derive(Debug, Deserialize)]
pub struct ListDeliverablesParams {
pub project: String,
#[serde(default)]
pub status: Option<DeliverableStatus>,
}
#[derive(Debug, Deserialize)]
pub struct RecordParams {
pub project: String,
pub id: String,
}
#[derive(Debug, Deserialize)]
pub struct CreateDeliverableParams {
pub project: String,
#[serde(flatten)]
pub body: dl::CreateDeliverable,
}
#[derive(Debug, Deserialize)]
pub struct CreateMilestoneParams {
pub project: String,
#[serde(flatten)]
pub body: dl::CreateMilestone,
}
#[derive(Debug, Deserialize)]
pub struct PatchDeliverableParams {
pub project: String,
pub id: String,
#[serde(flatten)]
pub body: dl::PatchDeliverable,
}
#[derive(Debug, Deserialize)]
pub struct PatchMilestoneParams {
pub project: String,
pub id: String,
#[serde(flatten)]
pub body: dl::PatchMilestone,
}
pub fn register(router: RpcRouter, state: &Arc<DaemonState>) -> RpcRouter {
let held = Arc::clone(state);
let r = router.typed::<CreateDeliverableParams, Deliverable, _, _>(
"mpm.deliverables.create",
move |p| {
let s = Arc::clone(&held);
async move {
dl::create_deliverable_op(&s, p.project, p.body)
.await
.map_err(Into::into)
}
},
);
let held = Arc::clone(state);
let r = r.typed::<ListDeliverablesParams, dl::DeliverablesResponse, _, _>(
"mpm.deliverables.list",
move |p| {
let s = Arc::clone(&held);
async move {
dl::list_deliverables_op(
&s,
&p.project,
dl::DeliverableListQuery { status: p.status },
)
.await
.map_err(Into::into)
}
},
);
let held = Arc::clone(state);
let r = r.typed::<RecordParams, Deliverable, _, _>("mpm.deliverables.get", move |p| {
let s = Arc::clone(&held);
async move {
dl::fetch_scoped(&s, &p.project, &p.id)
.await
.map_err(Into::into)
}
});
let held = Arc::clone(state);
let r =
r.typed::<PatchDeliverableParams, Deliverable, _, _>("mpm.deliverables.patch", move |p| {
let s = Arc::clone(&held);
async move {
dl::patch_deliverable_op(&s, &p.project, &p.id, p.body)
.await
.map_err(Into::into)
}
});
let held = Arc::clone(state);
let r = r.typed::<CreateMilestoneParams, Milestone, _, _>("mpm.milestones.create", move |p| {
let s = Arc::clone(&held);
async move {
dl::create_milestone_op(&s, p.project, p.body)
.await
.map_err(Into::into)
}
});
let held = Arc::clone(state);
let r =
r.typed::<ProjectParams, dl::MilestonesResponse, _, _>("mpm.milestones.list", move |p| {
let s = Arc::clone(&held);
async move {
dl::list_milestones_op(&s, &p.project)
.await
.map_err(Into::into)
}
});
let held = Arc::clone(state);
let r = r.typed::<RecordParams, Milestone, _, _>("mpm.milestones.get", move |p| {
let s = Arc::clone(&held);
async move {
dl::fetch_scoped_milestone(&s, &p.project, &p.id)
.await
.map_err(Into::into)
}
});
let held = Arc::clone(state);
r.typed::<PatchMilestoneParams, Milestone, _, _>("mpm.milestones.patch", move |p| {
let s = Arc::clone(&held);
async move {
dl::patch_milestone_op(&s, &p.project, &p.id, p.body)
.await
.map_err(Into::into)
}
})
}