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 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 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 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}