Skip to main content

lxmf_sdk/
control.rs

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}