saluki_core/runtime/tree/
api.rs

1use saluki_api::{
2    extract::State,
3    response::IntoResponse,
4    routing::{get, Router},
5    APIHandler, Json,
6};
7
8use super::{SupervisionTreeHandle, SUPERVISION_TREE_ROUTE};
9
10/// State used for the supervision tree API handler.
11#[derive(Clone)]
12pub struct SupervisionTreeState {
13    tree: SupervisionTreeHandle,
14}
15
16/// An API handler for reporting the state of a supervision tree.
17///
18/// This handler exposes a single route -- `/runtime/processes` -- returning every process in the tree: its name,
19/// process identifier, restart policy, restart count, lifetime, and resource usage, with each process's children
20/// nested beneath it.
21pub struct SupervisionTreeAPIHandler {
22    state: SupervisionTreeState,
23}
24
25impl SupervisionTreeAPIHandler {
26    pub(super) fn from_handle(tree: SupervisionTreeHandle) -> Self {
27        Self {
28            state: SupervisionTreeState { tree },
29        }
30    }
31
32    async fn processes_handler(State(state): State<SupervisionTreeState>) -> impl IntoResponse {
33        Json(state.tree.snapshot())
34    }
35}
36
37impl APIHandler for SupervisionTreeAPIHandler {
38    type State = SupervisionTreeState;
39
40    fn generate_initial_state(&self) -> Self::State {
41        self.state.clone()
42    }
43
44    fn generate_routes(&self) -> Router<Self::State> {
45        Router::new().route(SUPERVISION_TREE_ROUTE, get(Self::processes_handler))
46    }
47}