Skip to main content

laser_wire/
commands.rs

1// One trait pairing each managed command code with its request and reply wire
2// types. Not a multi-implementor abstraction (there is one wire contract and one established
3// band): a compile-time assertion that the code/type pairings match, giving
4// the SDK one generic send path and LaserData Cloud's dispatch table a fixture test
5// against the same pairings.
6
7use 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::checkpoint::{
16    CheckpointReadReply, CheckpointReply, CheckpointRequestEnvelope, DestinationGetRequest,
17    DestinationListRequest, QueryRouteListRequest,
18};
19use crate::codes::*;
20use crate::fork::{ForkCreate, ForkDelete, ForkList, ForkPromote, ForkPut, ForkReply};
21use crate::http::{DestinationHttpReply, DestinationHttpRequest};
22use crate::kv::{KvDelete, KvDeleteMany, KvGet, KvNamespaces, KvReply, KvScan, KvSet};
23use crate::query::{
24    QueryCancelEnvelope, QueryCancelReply, QueryEnvelope, QueryPageEnvelope, QueryReply,
25    QueryStatusEnvelope, QueryStatusReply,
26};
27use crate::session::{SessionReply, request as session};
28
29/// A managed command: the request type, its wire code, and the reply type the
30/// other end answers with.
31pub trait Command {
32    /// The managed command code this request rides.
33    const CODE: u32;
34    /// The reply wire type.
35    type Reply;
36}
37
38macro_rules! command {
39    ($request:ty, $code:expr, $reply:ty) => {
40        impl Command for $request {
41            const CODE: u32 = $code;
42            type Reply = $reply;
43        }
44    };
45}
46
47command!(WhoamiReq, AGDX_AUTHZ_WHOAMI_CODE, AuthzReply);
48command!(ListRolesReq, AGDX_AUTHZ_LIST_ROLES_CODE, AuthzReply);
49command!(GetRoleReq, AGDX_AUTHZ_GET_ROLE_CODE, AuthzReply);
50command!(GetBindingsReq, AGDX_AUTHZ_GET_BINDINGS_CODE, AuthzReply);
51command!(DefineRoleReq, AGDX_AUTHZ_DEFINE_ROLE_CODE, AuthzReply);
52command!(DeleteRoleReq, AGDX_AUTHZ_DELETE_ROLE_CODE, AuthzReply);
53command!(BindRolesReq, AGDX_AUTHZ_BIND_ROLES_CODE, AuthzReply);
54command!(QueryEnvelope, AGDX_QUERY_CODE, QueryReply);
55command!(QueryPageEnvelope, AGDX_QUERY_PAGE_CODE, QueryReply);
56command!(
57    QueryCancelEnvelope,
58    AGDX_QUERY_CANCEL_CODE,
59    QueryCancelReply
60);
61command!(
62    QueryStatusEnvelope,
63    AGDX_QUERY_STATUS_CODE,
64    QueryStatusReply
65);
66command!(
67    CheckpointRequestEnvelope,
68    AGDX_CHECKPOINT_CODE,
69    CheckpointReply
70);
71command!(
72    DestinationGetRequest,
73    AGDX_DESTINATION_GET_CODE,
74    CheckpointReadReply
75);
76command!(
77    DestinationListRequest,
78    AGDX_DESTINATION_LIST_CODE,
79    CheckpointReadReply
80);
81command!(
82    QueryRouteListRequest,
83    AGDX_QUERY_ROUTE_LIST_CODE,
84    CheckpointReadReply
85);
86command!(
87    DestinationHttpRequest,
88    AGDX_DESTINATION_HTTP_CODE,
89    DestinationHttpReply
90);
91command!(GetProjection, AGDX_GET_PROJECTION_CODE, BrowseReply);
92command!(ListProjections, AGDX_LIST_PROJECTIONS_CODE, BrowseReply);
93command!(GetSchema, AGDX_GET_SCHEMA_CODE, BrowseReply);
94command!(ListSchemas, AGDX_LIST_SCHEMAS_CODE, BrowseReply);
95command!(RegisterSchema, AGDX_REGISTER_SCHEMA_CODE, BrowseReply);
96command!(DecodeRecord, AGDX_DECODE_RECORD_CODE, BrowseReply);
97command!(KvGet, AGDX_KV_GET_CODE, KvReply);
98command!(KvSet, AGDX_KV_SET_CODE, KvReply);
99command!(KvScan, AGDX_KV_SCAN_CODE, KvReply);
100command!(KvDelete, AGDX_KV_DELETE_CODE, KvReply);
101command!(KvDeleteMany, AGDX_KV_DELETE_MANY_CODE, KvReply);
102command!(KvNamespaces, AGDX_KV_NAMESPACES_CODE, KvReply);
103command!(ForkCreate, AGDX_FORK_CREATE_CODE, ForkReply);
104command!(ForkDelete, AGDX_FORK_DELETE_CODE, ForkReply);
105command!(ForkPromote, AGDX_FORK_PROMOTE_CODE, ForkReply);
106command!(ForkList, AGDX_FORK_LIST_CODE, ForkReply);
107command!(ForkPut, AGDX_FORK_PUT_CODE, ForkReply);
108command!(session::SessionGet, AGDX_SESSION_GET_CODE, SessionReply);
109command!(session::SessionList, AGDX_SESSION_LIST_CODE, SessionReply);
110command!(
111    session::SessionEvents,
112    AGDX_SESSION_EVENTS_CODE,
113    SessionReply
114);
115command!(session::SessionState, AGDX_SESSION_STATE_CODE, SessionReply);
116command!(session::SessionLinks, AGDX_SESSION_LINKS_CODE, SessionReply);
117command!(
118    session::SessionSources,
119    AGDX_SESSION_SOURCES_CODE,
120    SessionReply
121);
122command!(
123    session::SessionChanges,
124    AGDX_SESSION_CHANGES_CODE,
125    SessionReply
126);
127
128#[cfg(test)]
129mod tests {
130    use super::*;
131
132    #[test]
133    fn given_command_impls_when_compared_then_codes_should_match_the_dictionary() {
134        assert_eq!(<WhoamiReq as Command>::CODE, 1_000_100);
135        assert_eq!(<ListRolesReq as Command>::CODE, 1_000_101);
136        assert_eq!(<GetRoleReq as Command>::CODE, 1_000_102);
137        assert_eq!(<GetBindingsReq as Command>::CODE, 1_000_103);
138        assert_eq!(<DefineRoleReq as Command>::CODE, 1_000_104);
139        assert_eq!(<DeleteRoleReq as Command>::CODE, 1_000_105);
140        assert_eq!(<BindRolesReq as Command>::CODE, 1_000_106);
141        assert_eq!(<QueryEnvelope as Command>::CODE, 1_000_200);
142        assert_eq!(<QueryPageEnvelope as Command>::CODE, 1_000_201);
143        assert_eq!(<QueryCancelEnvelope as Command>::CODE, 1_000_202);
144        assert_eq!(<QueryStatusEnvelope as Command>::CODE, 1_000_203);
145        assert_eq!(<CheckpointRequestEnvelope as Command>::CODE, 1_000_021);
146        assert_eq!(<DestinationGetRequest as Command>::CODE, 1_000_022);
147        assert_eq!(<DestinationListRequest as Command>::CODE, 1_000_023);
148        assert_eq!(<QueryRouteListRequest as Command>::CODE, 1_000_024);
149        assert_eq!(<DestinationHttpRequest as Command>::CODE, 1_000_025);
150        assert_eq!(<GetProjection as Command>::CODE, 1_000_210);
151        assert_eq!(<ListProjections as Command>::CODE, 1_000_211);
152        assert_eq!(<GetSchema as Command>::CODE, 1_000_220);
153        assert_eq!(<ListSchemas as Command>::CODE, 1_000_221);
154        assert_eq!(<RegisterSchema as Command>::CODE, 1_000_222);
155        assert_eq!(<DecodeRecord as Command>::CODE, 1_000_223);
156        assert_eq!(<KvGet as Command>::CODE, 1_000_300);
157        assert_eq!(<KvSet as Command>::CODE, 1_000_301);
158        assert_eq!(<KvScan as Command>::CODE, 1_000_302);
159        assert_eq!(<KvDelete as Command>::CODE, 1_000_303);
160        assert_eq!(<KvDeleteMany as Command>::CODE, 1_000_304);
161        assert_eq!(<KvNamespaces as Command>::CODE, 1_000_305);
162        assert_eq!(<ForkCreate as Command>::CODE, 1_000_400);
163        assert_eq!(<ForkDelete as Command>::CODE, 1_000_401);
164        assert_eq!(<ForkPromote as Command>::CODE, 1_000_402);
165        assert_eq!(<ForkList as Command>::CODE, 1_000_403);
166        assert_eq!(<ForkPut as Command>::CODE, 1_000_404);
167        assert_eq!(<session::SessionGet as Command>::CODE, 1_000_710);
168        assert_eq!(<session::SessionList as Command>::CODE, 1_000_711);
169        assert_eq!(<session::SessionEvents as Command>::CODE, 1_000_712);
170        assert_eq!(<session::SessionState as Command>::CODE, 1_000_713);
171        assert_eq!(<session::SessionLinks as Command>::CODE, 1_000_714);
172        assert_eq!(<session::SessionSources as Command>::CODE, 1_000_715);
173        assert_eq!(<session::SessionChanges as Command>::CODE, 1_000_716);
174    }
175}