netdox_plugin_rs/
put.rs

1use std::collections::HashMap;
2
3use crate::{
4    error::{FCallError, FCallResult},
5    model::{NetdoxWriter, PluginData},
6};
7
8const CREATE_DNS_FN: &str = "netdox_create_dns";
9const CREATE_NODE_FN: &str = "netdox_create_node";
10const CREATE_REPORT_FN: &str = "netdox_create_report";
11
12const CREATE_DNS_PDATA_FN: &str = "netdox_create_dns_plugin_data";
13const CREATE_NODE_PDATA_FN: &str = "netdox_create_node_plugin_data";
14const CREATE_PROC_NODE_PDATA_FN: &str = "netdox_create_proc_node_plugin_data";
15const CREATE_REPORT_DATA_FN: &str = "netdox_create_report_data";
16
17const CREATE_DNS_METADATA_FN: &str = "netdox_create_dns_metadata";
18const CREATE_NODE_METADATA_FN: &str = "netdox_create_node_metadata";
19const CREATE_PROC_NODE_METADATA_FN: &str = "netdox_create_proc_node_metadata";
20
21impl NetdoxWriter for redis::aio::MultiplexedConnection {
22    // DNS
23
24    async fn put_dns(
25        &mut self,
26        plugin: &str,
27        name: &str,
28        rtype: Option<&str>,
29        value: Option<&str>,
30    ) -> FCallResult<()> {
31        let mut cmd = redis::cmd("FCALL");
32        cmd.arg(CREATE_DNS_FN).arg(1).arg(name).arg(plugin);
33
34        match (rtype, value) {
35            (Some(rtype), Some(value)) => Ok(cmd.arg(rtype).arg(value).exec_async(self).await?),
36            (None, None) => Ok(cmd.exec_async(self).await?),
37            _ => Err(FCallError::WrongArgs {
38                function: CREATE_DNS_FN,
39                problem: "record type and value must both be provided or neiher provided.",
40            }),
41        }
42    }
43
44    async fn put_dns_plugin_data<'a>(
45        &mut self,
46        plugin: &str,
47        name: &str,
48        pdata_id: &str,
49        data: PluginData<'a>,
50    ) -> FCallResult<()> {
51        let mut cmd = redis::cmd("FCALL");
52        cmd.arg(CREATE_DNS_PDATA_FN)
53            .arg(1)
54            .arg(name)
55            .arg(plugin)
56            .arg(pdata_id);
57
58        data.add_as_args(&mut cmd);
59
60        Ok(cmd.exec_async(self).await?)
61    }
62
63    async fn put_dns_metadata(
64        &mut self,
65        plugin: &str,
66        name: &str,
67        metadata: &HashMap<&str, &str>,
68    ) -> FCallResult<()> {
69        let mut cmd = redis::cmd("FCALL");
70        cmd.arg(CREATE_DNS_METADATA_FN).arg(1).arg(name).arg(plugin);
71
72        for (key, val) in metadata {
73            cmd.arg(key).arg(val);
74        }
75
76        Ok(cmd.exec_async(self).await?)
77    }
78
79    // Nodes
80
81    async fn put_node(
82        &mut self,
83        plugin: &str,
84        name: &str,
85        dns_names: Vec<&str>,
86        exclusive: bool,
87        link_id: Option<&str>,
88    ) -> FCallResult<()> {
89        let mut cmd = redis::cmd("FCALL");
90        cmd.arg(CREATE_NODE_FN).arg(dns_names.len());
91
92        for name in dns_names {
93            cmd.arg(name);
94        }
95
96        cmd.arg(plugin).arg(name).arg(exclusive);
97
98        if let Some(link_id) = link_id {
99            cmd.arg(link_id);
100        }
101
102        Ok(cmd.exec_async(self).await?)
103    }
104
105    async fn put_node_plugin_data<'a>(
106        &mut self,
107        plugin: &str,
108        dns_names: Vec<&str>,
109        pdata_id: &str,
110        data: PluginData<'a>,
111    ) -> FCallResult<()> {
112        let mut cmd = redis::cmd("FCALL");
113        cmd.arg(CREATE_NODE_PDATA_FN).arg(dns_names.len());
114
115        for name in dns_names {
116            cmd.arg(name);
117        }
118
119        cmd.arg(plugin).arg(pdata_id);
120
121        data.add_as_args(&mut cmd);
122
123        Ok(cmd.exec_async(self).await?)
124    }
125
126    async fn put_proc_node_plugin_data<'a>(
127        &mut self,
128        plugin: &str,
129        link_id: &str,
130        pdata_id: &str,
131        data: PluginData<'a>,
132    ) -> FCallResult<()> {
133        let mut cmd = redis::cmd("FCALL");
134        cmd.arg(CREATE_PROC_NODE_PDATA_FN)
135            .arg(1)
136            .arg(link_id)
137            .arg(plugin)
138            .arg(pdata_id);
139
140        data.add_as_args(&mut cmd);
141
142        Ok(cmd.exec_async(self).await?)
143    }
144
145    async fn put_node_metadata(
146        &mut self,
147        plugin: &str,
148        dns_names: Vec<&str>,
149        metadata: &HashMap<&str, &str>,
150    ) -> FCallResult<()> {
151        let mut cmd = redis::cmd("FCALL");
152        cmd.arg(CREATE_NODE_METADATA_FN).arg(dns_names.len());
153        for name in dns_names {
154            cmd.arg(name);
155        }
156        cmd.arg(plugin);
157
158        for (key, val) in metadata {
159            cmd.arg(key).arg(val);
160        }
161
162        Ok(cmd.exec_async(self).await?)
163    }
164
165    async fn put_proc_node_metadata(
166        &mut self,
167        plugin: &str,
168        link_id: &str,
169        metadata: &HashMap<&str, &str>,
170    ) -> FCallResult<()> {
171        let mut cmd = redis::cmd("FCALL");
172        cmd.arg(CREATE_PROC_NODE_METADATA_FN)
173            .arg(1)
174            .arg(link_id)
175            .arg(plugin);
176
177        for (key, val) in metadata {
178            cmd.arg(key).arg(val);
179        }
180
181        Ok(cmd.exec_async(self).await?)
182    }
183
184    // Reports
185
186    async fn put_report(
187        &mut self,
188        plugin: &str,
189        report_id: &str,
190        title: &str,
191        length: usize,
192    ) -> FCallResult<()> {
193        let mut cmd = redis::cmd("FCALL");
194
195        cmd.arg(CREATE_REPORT_FN)
196            .arg(1)
197            .arg(report_id)
198            .arg(plugin)
199            .arg(title)
200            .arg(length);
201
202        Ok(cmd.exec_async(self).await?)
203    }
204
205    async fn put_report_data<'a>(
206        &mut self,
207        plugin: &str,
208        report_id: &str,
209        index: usize,
210        data: PluginData<'a>,
211    ) -> FCallResult<()> {
212        let mut cmd = redis::cmd("FCALL");
213        cmd.arg(CREATE_REPORT_DATA_FN)
214            .arg(1)
215            .arg(report_id)
216            .arg(plugin)
217            .arg(index);
218
219        data.add_as_args(&mut cmd);
220
221        Ok(cmd.exec_async(self).await?)
222    }
223}