1use crate::SdkError;
2use serde::{Deserialize, Serialize};
3use serde_json::Value as JsonValue;
4
5#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
6pub struct SdkControlRequest<O> {
7 pub operation: O,
8 #[serde(default)]
9 pub params: JsonValue,
10}
11
12impl<O> SdkControlRequest<O> {
13 pub fn new(operation: O, params: JsonValue) -> Self {
14 Self { operation, params }
15 }
16}
17
18#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
19pub struct SdkControlResult {
20 pub operation_id: String,
21 pub accepted: bool,
22 pub value: JsonValue,
23}
24
25macro_rules! control_operations {
26 ($name:ident { $($variant:ident => ($id:literal, $command:literal)),+ $(,)? }) => {
27 #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
28 #[serde(rename_all = "snake_case")]
29 #[non_exhaustive]
30 pub enum $name { $($variant),+ }
31
32 impl $name {
33 pub(crate) fn operation_id(self) -> &'static str {
34 match self { $(Self::$variant => $id),+ }
35 }
36
37 pub(crate) fn is_command(self) -> bool {
38 match self { $(Self::$variant => $command),+ }
39 }
40 }
41 };
42}
43
44control_operations!(RnsRuntimeOperation {
45 Status => ("rns.runtime.status", false),
46 ClearMessages => ("rns.runtime.clear.messages", true),
47 ClearResources => ("rns.runtime.clear.resources", true),
48 ClearPeers => ("rns.runtime.clear.peers", true),
49 ClearAll => ("rns.runtime.clear.all", true),
50});
51
52control_operations!(RnsTransportOperation {
53 PathStatus => ("rns.transport.path.status", false),
54 RequestPath => ("rns.transport.path.request", true),
55 NextHop => ("rns.transport.path.next_hop", false),
56 NextHopInterface => ("rns.transport.path.next_hop_interface", false),
57 FirstHopTimeout => ("rns.transport.path.first_hop_timeout", false),
58 DropPath => ("rns.transport.path.drop", true),
59 DropAllVia => ("rns.transport.path.drop_all_via", true),
60 DropAnnounceQueues => ("rns.transport.announce_queues.drop", true),
61 RateTable => ("rns.transport.rate_table", false),
62 BlackholesList => ("rns.transport.blackholes.list", false),
63 BlackholeAdd => ("rns.transport.blackholes.add", true),
64 BlackholeRemove => ("rns.transport.blackholes.remove", true),
65});
66
67control_operations!(RnsInterfacesOperation {
68 Set => ("rns.interfaces.set", true),
69 Discovered => ("rns.interfaces.discovered", false),
70});
71
72control_operations!(RnsDataPlaneOperation {
73 LinkCount => ("rns.data_plane.links.count", false),
74 PacketRssi => ("rns.data_plane.packet.rssi", false),
75 PacketSnr => ("rns.data_plane.packet.snr", false),
76 PacketQuality => ("rns.data_plane.packet.q", false),
77 AnnounceNow => ("rns.data_plane.announce.now", true),
78 AnnounceDelivery => ("rns.data_plane.announce.delivery", false),
79 AnnounceReceived => ("rns.data_plane.announce.received", false),
80});
81
82control_operations!(LxmfRouterOperation {
83 Stats => ("app.router.stats", false),
84 StoragePolicyGet => ("app.router.storage_policy.get", false),
85 StoragePolicySet => ("app.router.storage_policy.set", true),
86});
87
88control_operations!(LxmfPropagationOperation {
89 Status => ("app.propagation.status", false),
90 Enable => ("app.propagation.enable", true),
91 NodeGet => ("app.propagation.node.get", false),
92 NodeSet => ("app.propagation.node.set", true),
93 NodeList => ("app.propagation.node.list", false),
94 PeerSync => ("app.propagation.peer_sync", true),
95 PeerMaintenance => ("app.propagation.peer_maintenance", true),
96 RemoteStatus => ("app.propagation.remote_status", false),
97 RemoteFetch => ("app.propagation.remote_fetch", true),
98 RemoteDownload => ("app.propagation.remote_download", true),
99 RemoteSync => ("app.propagation.remote_sync", true),
100 RemoteUnpeer => ("app.propagation.remote_unpeer", true),
101 Ingest => ("app.propagation.ingest", true),
102 Fetch => ("app.propagation.fetch", true),
103 DeliveryPolicyGet => ("app.propagation.delivery_policy.get", false),
104 DeliveryPolicySet => ("app.propagation.delivery_policy.set", true),
105 ControlAllow => ("app.propagation.control.allow", true),
106 ControlDisallow => ("app.propagation.control.disallow", true),
107});
108
109pub trait RnsSdkRuntime {
110 fn rns_runtime(
111 &self,
112 request: SdkControlRequest<RnsRuntimeOperation>,
113 ) -> Result<SdkControlResult, SdkError>;
114}
115
116pub trait RnsSdkTransport {
117 fn rns_transport(
118 &self,
119 request: SdkControlRequest<RnsTransportOperation>,
120 ) -> Result<SdkControlResult, SdkError>;
121}
122
123pub trait RnsSdkInterfaces {
124 fn rns_interfaces(
125 &self,
126 request: SdkControlRequest<RnsInterfacesOperation>,
127 ) -> Result<SdkControlResult, SdkError>;
128}
129
130pub trait RnsSdkDataPlane {
131 fn rns_data_plane(
132 &self,
133 request: SdkControlRequest<RnsDataPlaneOperation>,
134 ) -> Result<SdkControlResult, SdkError>;
135}
136
137pub trait LxmfSdkRouter {
138 fn lxmf_router(
139 &self,
140 request: SdkControlRequest<LxmfRouterOperation>,
141 ) -> Result<SdkControlResult, SdkError>;
142}
143
144pub trait LxmfSdkPropagation {
145 fn lxmf_propagation(
146 &self,
147 request: SdkControlRequest<LxmfPropagationOperation>,
148 ) -> Result<SdkControlResult, SdkError>;
149}