Skip to main content

meerkat_workgraph/
rest_contract.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum WorkGraphRestRoute {
3    Items,
4    Item,
5    Ready,
6    Snapshot,
7    Events,
8    GoalStatus,
9    AttentionList,
10}
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq)]
13pub struct WorkGraphRestOperationDescriptor {
14    pub method: &'static str,
15    pub summary: &'static str,
16    pub request_schema: Option<&'static str>,
17    pub response_schema: &'static str,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq)]
21pub struct WorkGraphRestPathDescriptor {
22    pub route: WorkGraphRestRoute,
23    pub path: &'static str,
24    pub operations: &'static [WorkGraphRestOperationDescriptor],
25}
26
27const WORKGRAPH_ITEMS_OPERATIONS: &[WorkGraphRestOperationDescriptor] =
28    &[WorkGraphRestOperationDescriptor {
29        method: "get",
30        summary: "List WorkGraph items",
31        request_schema: None,
32        response_schema: "WorkGraphItemsResponse",
33    }];
34
35const WORKGRAPH_ITEM_OPERATIONS: &[WorkGraphRestOperationDescriptor] =
36    &[WorkGraphRestOperationDescriptor {
37        method: "get",
38        summary: "Get WorkGraph item",
39        request_schema: None,
40        response_schema: "WorkItem",
41    }];
42
43const WORKGRAPH_READY_OPERATIONS: &[WorkGraphRestOperationDescriptor] =
44    &[WorkGraphRestOperationDescriptor {
45        method: "get",
46        summary: "List ready WorkGraph items",
47        request_schema: None,
48        response_schema: "WorkGraphItemsResponse",
49    }];
50
51const WORKGRAPH_SNAPSHOT_OPERATIONS: &[WorkGraphRestOperationDescriptor] =
52    &[WorkGraphRestOperationDescriptor {
53        method: "get",
54        summary: "Read WorkGraph snapshot",
55        request_schema: None,
56        response_schema: "WorkGraphSnapshot",
57    }];
58
59const WORKGRAPH_EVENTS_OPERATIONS: &[WorkGraphRestOperationDescriptor] =
60    &[WorkGraphRestOperationDescriptor {
61        method: "get",
62        summary: "List WorkGraph events",
63        request_schema: None,
64        response_schema: "WorkGraphEventsResponse",
65    }];
66
67const WORKGRAPH_GOAL_STATUS_OPERATIONS: &[WorkGraphRestOperationDescriptor] =
68    &[WorkGraphRestOperationDescriptor {
69        method: "post",
70        summary: "Read WorkGraph goal item and attention status",
71        request_schema: Some("GoalStatusRequest"),
72        response_schema: "GoalStatusResult",
73    }];
74
75const WORKGRAPH_ATTENTION_LIST_OPERATIONS: &[WorkGraphRestOperationDescriptor] =
76    &[WorkGraphRestOperationDescriptor {
77        method: "post",
78        summary: "List WorkGraph attention bindings",
79        request_schema: Some("AttentionListRequest"),
80        response_schema: "AttentionListResult",
81    }];
82
83pub const WORKGRAPH_REST_PATHS: &[WorkGraphRestPathDescriptor] = &[
84    WorkGraphRestPathDescriptor {
85        route: WorkGraphRestRoute::Items,
86        path: "/workgraph/items",
87        operations: WORKGRAPH_ITEMS_OPERATIONS,
88    },
89    WorkGraphRestPathDescriptor {
90        route: WorkGraphRestRoute::Item,
91        path: "/workgraph/items/{id}",
92        operations: WORKGRAPH_ITEM_OPERATIONS,
93    },
94    WorkGraphRestPathDescriptor {
95        route: WorkGraphRestRoute::Ready,
96        path: "/workgraph/ready",
97        operations: WORKGRAPH_READY_OPERATIONS,
98    },
99    WorkGraphRestPathDescriptor {
100        route: WorkGraphRestRoute::Snapshot,
101        path: "/workgraph/snapshot",
102        operations: WORKGRAPH_SNAPSHOT_OPERATIONS,
103    },
104    WorkGraphRestPathDescriptor {
105        route: WorkGraphRestRoute::Events,
106        path: "/workgraph/events",
107        operations: WORKGRAPH_EVENTS_OPERATIONS,
108    },
109    WorkGraphRestPathDescriptor {
110        route: WorkGraphRestRoute::GoalStatus,
111        path: "/workgraph/goal/status",
112        operations: WORKGRAPH_GOAL_STATUS_OPERATIONS,
113    },
114    WorkGraphRestPathDescriptor {
115        route: WorkGraphRestRoute::AttentionList,
116        path: "/workgraph/attention/list",
117        operations: WORKGRAPH_ATTENTION_LIST_OPERATIONS,
118    },
119];
120
121pub fn workgraph_rest_path_catalog() -> &'static [WorkGraphRestPathDescriptor] {
122    WORKGRAPH_REST_PATHS
123}
124
125pub fn workgraph_rest_response_schema(path: &str, method: &str) -> Option<&'static str> {
126    WORKGRAPH_REST_PATHS
127        .iter()
128        .find(|entry| entry.path == path)
129        .and_then(|entry| {
130            entry
131                .operations
132                .iter()
133                .find(|operation| operation.method == method)
134        })
135        .map(|operation| operation.response_schema)
136}
137
138pub fn workgraph_rest_request_response_schema(
139    path: &str,
140    method: &str,
141) -> Option<(Option<&'static str>, &'static str)> {
142    WORKGRAPH_REST_PATHS
143        .iter()
144        .find(|entry| entry.path == path)
145        .and_then(|entry| {
146            entry
147                .operations
148                .iter()
149                .find(|operation| operation.method == method)
150        })
151        .map(|operation| (operation.request_schema, operation.response_schema))
152}