1use crate::agent_workflow::{AgentCancel, AgentList, AgentReply, AgentStatusReq, AgentSubmit};
8use crate::authz::{
9 AuthzReply, BindRolesReq, DefineRoleReq, DeleteRoleReq, GetBindingsReq, GetRoleReq,
10 ListRolesReq, WhoamiReq,
11};
12use crate::browse::{
13 BrowseReply, DecodeRecord, GetProjection, GetSchema, ListProjections, ListSchemas,
14 RegisterSchema,
15};
16use crate::checkpoint::{
17 CheckpointReadReply, CheckpointReply, CheckpointRequestEnvelope, DestinationGetRequest,
18 DestinationListRequest, QueryRouteListRequest,
19};
20use crate::codes::*;
21use crate::fork::{ForkCreate, ForkDelete, ForkList, ForkPromote, ForkPut, ForkReply};
22use crate::kv::{KvDelete, KvDeleteMany, KvGet, KvNamespaces, KvReply, KvScan, KvSet};
23use crate::query::{
24 QueryCancelEnvelope, QueryCancelReply, QueryEnvelope, QueryPageEnvelope, QueryReply,
25 QueryStatusEnvelope, QueryStatusReply,
26};
27
28pub trait Command {
31 const CODE: u32;
33 type Reply;
35}
36
37macro_rules! command {
38 ($request:ty, $code:expr, $reply:ty) => {
39 impl Command for $request {
40 const CODE: u32 = $code;
41 type Reply = $reply;
42 }
43 };
44}
45
46command!(WhoamiReq, AGDX_AUTHZ_WHOAMI_CODE, AuthzReply);
47command!(ListRolesReq, AGDX_AUTHZ_LIST_ROLES_CODE, AuthzReply);
48command!(GetRoleReq, AGDX_AUTHZ_GET_ROLE_CODE, AuthzReply);
49command!(GetBindingsReq, AGDX_AUTHZ_GET_BINDINGS_CODE, AuthzReply);
50command!(DefineRoleReq, AGDX_AUTHZ_DEFINE_ROLE_CODE, AuthzReply);
51command!(DeleteRoleReq, AGDX_AUTHZ_DELETE_ROLE_CODE, AuthzReply);
52command!(BindRolesReq, AGDX_AUTHZ_BIND_ROLES_CODE, AuthzReply);
53command!(QueryEnvelope, AGDX_QUERY_CODE, QueryReply);
54command!(QueryPageEnvelope, AGDX_QUERY_PAGE_CODE, QueryReply);
55command!(
56 QueryCancelEnvelope,
57 AGDX_QUERY_CANCEL_CODE,
58 QueryCancelReply
59);
60command!(
61 QueryStatusEnvelope,
62 AGDX_QUERY_STATUS_CODE,
63 QueryStatusReply
64);
65command!(
66 CheckpointRequestEnvelope,
67 AGDX_CHECKPOINT_CODE,
68 CheckpointReply
69);
70command!(
71 DestinationGetRequest,
72 AGDX_DESTINATION_GET_CODE,
73 CheckpointReadReply
74);
75command!(
76 DestinationListRequest,
77 AGDX_DESTINATION_LIST_CODE,
78 CheckpointReadReply
79);
80command!(
81 QueryRouteListRequest,
82 AGDX_QUERY_ROUTE_LIST_CODE,
83 CheckpointReadReply
84);
85command!(GetProjection, AGDX_GET_PROJECTION_CODE, BrowseReply);
86command!(ListProjections, AGDX_LIST_PROJECTIONS_CODE, BrowseReply);
87command!(GetSchema, AGDX_GET_SCHEMA_CODE, BrowseReply);
88command!(ListSchemas, AGDX_LIST_SCHEMAS_CODE, BrowseReply);
89command!(RegisterSchema, AGDX_REGISTER_SCHEMA_CODE, BrowseReply);
90command!(DecodeRecord, AGDX_DECODE_RECORD_CODE, BrowseReply);
91command!(KvGet, AGDX_KV_GET_CODE, KvReply);
92command!(KvSet, AGDX_KV_SET_CODE, KvReply);
93command!(KvScan, AGDX_KV_SCAN_CODE, KvReply);
94command!(KvDelete, AGDX_KV_DELETE_CODE, KvReply);
95command!(KvDeleteMany, AGDX_KV_DELETE_MANY_CODE, KvReply);
96command!(KvNamespaces, AGDX_KV_NAMESPACES_CODE, KvReply);
97command!(ForkCreate, AGDX_FORK_CREATE_CODE, ForkReply);
98command!(ForkDelete, AGDX_FORK_DELETE_CODE, ForkReply);
99command!(ForkPromote, AGDX_FORK_PROMOTE_CODE, ForkReply);
100command!(ForkList, AGDX_FORK_LIST_CODE, ForkReply);
101command!(ForkPut, AGDX_FORK_PUT_CODE, ForkReply);
102command!(AgentSubmit, AGDX_AGENT_SUBMIT_CODE, AgentReply);
103command!(AgentCancel, AGDX_AGENT_CANCEL_CODE, AgentReply);
104command!(AgentStatusReq, AGDX_AGENT_STATUS_CODE, AgentReply);
105command!(AgentList, AGDX_AGENT_LIST_CODE, AgentReply);
106
107#[cfg(test)]
108mod tests {
109 use super::*;
110
111 #[test]
112 fn given_command_impls_when_compared_then_codes_should_match_the_dictionary() {
113 assert_eq!(<WhoamiReq as Command>::CODE, 1_000_100);
114 assert_eq!(<ListRolesReq as Command>::CODE, 1_000_101);
115 assert_eq!(<GetRoleReq as Command>::CODE, 1_000_102);
116 assert_eq!(<GetBindingsReq as Command>::CODE, 1_000_103);
117 assert_eq!(<DefineRoleReq as Command>::CODE, 1_000_104);
118 assert_eq!(<DeleteRoleReq as Command>::CODE, 1_000_105);
119 assert_eq!(<BindRolesReq as Command>::CODE, 1_000_106);
120 assert_eq!(<QueryEnvelope as Command>::CODE, 1_000_200);
121 assert_eq!(<QueryPageEnvelope as Command>::CODE, 1_000_201);
122 assert_eq!(<QueryCancelEnvelope as Command>::CODE, 1_000_202);
123 assert_eq!(<QueryStatusEnvelope as Command>::CODE, 1_000_203);
124 assert_eq!(<CheckpointRequestEnvelope as Command>::CODE, 1_000_021);
125 assert_eq!(<DestinationGetRequest as Command>::CODE, 1_000_022);
126 assert_eq!(<DestinationListRequest as Command>::CODE, 1_000_023);
127 assert_eq!(<QueryRouteListRequest as Command>::CODE, 1_000_024);
128 assert_eq!(<GetProjection as Command>::CODE, 1_000_210);
129 assert_eq!(<ListProjections as Command>::CODE, 1_000_211);
130 assert_eq!(<GetSchema as Command>::CODE, 1_000_220);
131 assert_eq!(<ListSchemas as Command>::CODE, 1_000_221);
132 assert_eq!(<RegisterSchema as Command>::CODE, 1_000_222);
133 assert_eq!(<DecodeRecord as Command>::CODE, 1_000_223);
134 assert_eq!(<KvGet as Command>::CODE, 1_000_300);
135 assert_eq!(<KvSet as Command>::CODE, 1_000_301);
136 assert_eq!(<KvScan as Command>::CODE, 1_000_302);
137 assert_eq!(<KvDelete as Command>::CODE, 1_000_303);
138 assert_eq!(<KvDeleteMany as Command>::CODE, 1_000_304);
139 assert_eq!(<KvNamespaces as Command>::CODE, 1_000_305);
140 assert_eq!(<ForkCreate as Command>::CODE, 1_000_400);
141 assert_eq!(<ForkDelete as Command>::CODE, 1_000_401);
142 assert_eq!(<ForkPromote as Command>::CODE, 1_000_402);
143 assert_eq!(<ForkList as Command>::CODE, 1_000_403);
144 assert_eq!(<ForkPut as Command>::CODE, 1_000_404);
145 assert_eq!(<AgentSubmit as Command>::CODE, 1_000_700);
146 assert_eq!(<AgentCancel as Command>::CODE, 1_000_701);
147 assert_eq!(<AgentStatusReq as Command>::CODE, 1_000_702);
148 assert_eq!(<AgentList as Command>::CODE, 1_000_703);
149 }
150}