1use crate::authz::{
8 AuthzReply, BindRolesReq, DefineRoleReq, DeleteRoleReq, GetBindingsReq, GetRoleReq,
9 ListRolesReq, WhoamiReq,
10};
11use crate::browse::{
12 BrowseReply, DecodeRecord, GetProjection, GetSchema, ListProjections, ListSchemas,
13 RegisterSchema,
14};
15use crate::codes::*;
16use crate::fork::{ForkCreate, ForkDelete, ForkList, ForkPromote, ForkPut, ForkReply};
17use crate::kv::{KvDelete, KvDeleteMany, KvGet, KvNamespaces, KvReply, KvScan, KvSet};
18use crate::query::{QueryEnvelope, QueryReply};
19use crate::session::{SessionReply, request as session};
20
21pub trait Command {
24 const CODE: u32;
26 type Reply;
28}
29
30macro_rules! command {
31 ($request:ty, $code:expr, $reply:ty) => {
32 impl Command for $request {
33 const CODE: u32 = $code;
34 type Reply = $reply;
35 }
36 };
37}
38
39command!(WhoamiReq, AGDX_AUTHZ_WHOAMI_CODE, AuthzReply);
40command!(ListRolesReq, AGDX_AUTHZ_LIST_ROLES_CODE, AuthzReply);
41command!(GetRoleReq, AGDX_AUTHZ_GET_ROLE_CODE, AuthzReply);
42command!(GetBindingsReq, AGDX_AUTHZ_GET_BINDINGS_CODE, AuthzReply);
43command!(DefineRoleReq, AGDX_AUTHZ_DEFINE_ROLE_CODE, AuthzReply);
44command!(DeleteRoleReq, AGDX_AUTHZ_DELETE_ROLE_CODE, AuthzReply);
45command!(BindRolesReq, AGDX_AUTHZ_BIND_ROLES_CODE, AuthzReply);
46command!(QueryEnvelope, AGDX_QUERY_CODE, QueryReply);
47command!(GetProjection, AGDX_GET_PROJECTION_CODE, BrowseReply);
48command!(ListProjections, AGDX_LIST_PROJECTIONS_CODE, BrowseReply);
49command!(GetSchema, AGDX_GET_SCHEMA_CODE, BrowseReply);
50command!(ListSchemas, AGDX_LIST_SCHEMAS_CODE, BrowseReply);
51command!(RegisterSchema, AGDX_REGISTER_SCHEMA_CODE, BrowseReply);
52command!(DecodeRecord, AGDX_DECODE_RECORD_CODE, BrowseReply);
53command!(KvGet, AGDX_KV_GET_CODE, KvReply);
54command!(KvSet, AGDX_KV_SET_CODE, KvReply);
55command!(KvScan, AGDX_KV_SCAN_CODE, KvReply);
56command!(KvDelete, AGDX_KV_DELETE_CODE, KvReply);
57command!(KvDeleteMany, AGDX_KV_DELETE_MANY_CODE, KvReply);
58command!(KvNamespaces, AGDX_KV_NAMESPACES_CODE, KvReply);
59command!(ForkCreate, AGDX_FORK_CREATE_CODE, ForkReply);
60command!(ForkDelete, AGDX_FORK_DELETE_CODE, ForkReply);
61command!(ForkPromote, AGDX_FORK_PROMOTE_CODE, ForkReply);
62command!(ForkList, AGDX_FORK_LIST_CODE, ForkReply);
63command!(ForkPut, AGDX_FORK_PUT_CODE, ForkReply);
64command!(session::SessionGet, AGDX_SESSION_GET_CODE, SessionReply);
65command!(session::SessionList, AGDX_SESSION_LIST_CODE, SessionReply);
66command!(
67 session::SessionEvents,
68 AGDX_SESSION_EVENTS_CODE,
69 SessionReply
70);
71command!(session::SessionState, AGDX_SESSION_STATE_CODE, SessionReply);
72command!(session::SessionLinks, AGDX_SESSION_LINKS_CODE, SessionReply);
73command!(
74 session::SessionSources,
75 AGDX_SESSION_SOURCES_CODE,
76 SessionReply
77);
78command!(
79 session::SessionChanges,
80 AGDX_SESSION_CHANGES_CODE,
81 SessionReply
82);
83
84#[cfg(test)]
85mod tests {
86 use super::*;
87
88 #[test]
89 fn given_command_impls_when_compared_then_codes_should_match_the_dictionary() {
90 assert_eq!(<WhoamiReq as Command>::CODE, 1_000_100);
91 assert_eq!(<ListRolesReq as Command>::CODE, 1_000_101);
92 assert_eq!(<GetRoleReq as Command>::CODE, 1_000_102);
93 assert_eq!(<GetBindingsReq as Command>::CODE, 1_000_103);
94 assert_eq!(<DefineRoleReq as Command>::CODE, 1_000_104);
95 assert_eq!(<DeleteRoleReq as Command>::CODE, 1_000_105);
96 assert_eq!(<BindRolesReq as Command>::CODE, 1_000_106);
97 assert_eq!(<QueryEnvelope as Command>::CODE, 1_000_200);
98 assert_eq!(<GetProjection as Command>::CODE, 1_000_210);
99 assert_eq!(<ListProjections as Command>::CODE, 1_000_211);
100 assert_eq!(<GetSchema as Command>::CODE, 1_000_220);
101 assert_eq!(<ListSchemas as Command>::CODE, 1_000_221);
102 assert_eq!(<RegisterSchema as Command>::CODE, 1_000_222);
103 assert_eq!(<DecodeRecord as Command>::CODE, 1_000_223);
104 assert_eq!(<KvGet as Command>::CODE, 1_000_300);
105 assert_eq!(<KvSet as Command>::CODE, 1_000_301);
106 assert_eq!(<KvScan as Command>::CODE, 1_000_302);
107 assert_eq!(<KvDelete as Command>::CODE, 1_000_303);
108 assert_eq!(<KvDeleteMany as Command>::CODE, 1_000_304);
109 assert_eq!(<KvNamespaces as Command>::CODE, 1_000_305);
110 assert_eq!(<ForkCreate as Command>::CODE, 1_000_400);
111 assert_eq!(<ForkDelete as Command>::CODE, 1_000_401);
112 assert_eq!(<ForkPromote as Command>::CODE, 1_000_402);
113 assert_eq!(<ForkList as Command>::CODE, 1_000_403);
114 assert_eq!(<ForkPut as Command>::CODE, 1_000_404);
115 assert_eq!(<session::SessionGet as Command>::CODE, 1_000_710);
116 assert_eq!(<session::SessionList as Command>::CODE, 1_000_711);
117 assert_eq!(<session::SessionEvents as Command>::CODE, 1_000_712);
118 assert_eq!(<session::SessionState as Command>::CODE, 1_000_713);
119 assert_eq!(<session::SessionLinks as Command>::CODE, 1_000_714);
120 assert_eq!(<session::SessionSources as Command>::CODE, 1_000_715);
121 assert_eq!(<session::SessionChanges as Command>::CODE, 1_000_716);
122 }
123}