1#[derive(Debug, Clone)]
2pub struct ConfigClient<T> {
3 client: T,
4 path: String,
5}
6impl<T> ConfigClient<T>
7where
8 T: crate::client::Client,
9{
10 pub fn new(client: T, parent_path: &str) -> Self {
11 Self {
12 client,
13 path: format!("{}{}", parent_path, "/config"),
14 }
15 }
16}
17impl<T> ConfigClient<T>
18where
19 T: crate::client::Client,
20{
21 #[doc = "Get node configuration options."]
22 #[doc = ""]
23 #[doc = "Permission check: perm(\"/\", [\"Sys.Audit\"])"]
24 pub async fn get(&self, params: GetParams) -> Result<GetOutput, T::Error> {
25 let path = self.path.to_string();
26 self.client.get(&path, ¶ms).await
27 }
28}
29impl<T> ConfigClient<T>
30where
31 T: crate::client::Client,
32{
33 #[doc = "Set node configuration options."]
34 #[doc = ""]
35 #[doc = "Permission check: perm(\"/\", [\"Sys.Modify\"])"]
36 pub async fn put(&self, params: PutParams) -> Result<(), T::Error> {
37 let path = self.path.to_string();
38 self.client.put(&path, ¶ms).await
39 }
40}
41#[derive(Clone, Debug, :: serde :: Serialize, :: serde :: Deserialize, Default)]
42pub struct GetOutput {
43 #[serde(skip_serializing_if = "Option::is_none", default)]
44 #[doc = "Node specific ACME settings."]
45 #[doc = ""]
46 pub acme: Option<String>,
47 #[serde(rename = "acmedomain[n]")]
48 #[serde(
49 serialize_with = "crate::types::serialize_multi::<NumberedAcmedomains, _>",
50 deserialize_with = "crate::types::deserialize_multi::<NumberedAcmedomains, _>"
51 )]
52 #[serde(skip_serializing_if = "::std::collections::HashMap::is_empty", default)]
53 #[serde(flatten)]
54 #[doc = "ACME domain and validation plugin"]
55 #[doc = ""]
56 pub acmedomains: ::std::collections::HashMap<u32, String>,
57 #[serde(rename = "ballooning-target")]
58 #[serde(skip_serializing_if = "Option::is_none", default)]
59 #[doc = "RAM usage target for ballooning (in percent of total memory)"]
60 #[doc = ""]
61 pub ballooning_target: Option<BallooningTargetInt>,
62 #[serde(skip_serializing_if = "Option::is_none", default)]
63 #[doc = "Description for the Node. Shown in the web-interface node notes panel. This is saved as comment inside the configuration file."]
64 #[doc = ""]
65 pub description: Option<DescriptionStr>,
66 #[serde(skip_serializing_if = "Option::is_none", default)]
67 #[doc = "Prevent changes if current configuration file has different SHA1 digest. This can be used to prevent concurrent modifications."]
68 #[doc = ""]
69 pub digest: Option<DigestStr>,
70 #[serde(rename = "startall-onboot-delay")]
71 #[serde(skip_serializing_if = "Option::is_none", default)]
72 #[doc = "Initial delay in seconds, before starting all the Virtual Guests with on-boot enabled."]
73 #[doc = ""]
74 pub startall_onboot_delay: Option<StartallOnbootDelayInt>,
75 #[serde(skip_serializing_if = "Option::is_none", default)]
76 #[doc = "Node specific wake on LAN settings."]
77 #[doc = ""]
78 pub wakeonlan: Option<String>,
79 #[serde(
80 flatten,
81 deserialize_with = "crate::types::multi::deserialize_additional_data::<'_, GetOutput, _, _>"
82 )]
83 pub additional_properties: ::std::collections::HashMap<String, ::serde_json::Value>,
84}
85impl crate::types::multi::Test for GetOutput {
86 fn test_fn() -> fn(&str) -> bool {
87 fn the_test(input: &str) -> bool {
88 let array = [
89 <NumberedAcmedomains as crate::types::multi::NumberedItems>::key_matches
90 as fn(&str) -> bool,
91 ];
92 array.iter().any(|f| f(input))
93 }
94 the_test as _
95 }
96}
97#[derive(Clone, Debug, :: serde :: Serialize, :: serde :: Deserialize, Default)]
98pub struct GetParams {
99 #[serde(skip_serializing_if = "Option::is_none", default)]
100 #[doc = "Return only a specific property from the node configuration."]
101 #[doc = ""]
102 pub property: Option<Property>,
103 #[serde(
104 flatten,
105 default,
106 skip_serializing_if = "::std::collections::HashMap::is_empty"
107 )]
108 pub additional_properties: ::std::collections::HashMap<String, ::serde_json::Value>,
109}
110#[derive(Clone, Debug, :: serde :: Serialize, :: serde :: Deserialize, Default)]
111pub struct PutParams {
112 #[serde(skip_serializing_if = "Option::is_none", default)]
113 #[doc = "Node specific ACME settings."]
114 #[doc = ""]
115 pub acme: Option<String>,
116 #[serde(rename = "acmedomain[n]")]
117 #[serde(
118 serialize_with = "crate::types::serialize_multi::<NumberedAcmedomains, _>",
119 deserialize_with = "crate::types::deserialize_multi::<NumberedAcmedomains, _>"
120 )]
121 #[serde(skip_serializing_if = "::std::collections::HashMap::is_empty", default)]
122 #[serde(flatten)]
123 #[doc = "ACME domain and validation plugin"]
124 #[doc = ""]
125 pub acmedomains: ::std::collections::HashMap<u32, String>,
126 #[serde(rename = "ballooning-target")]
127 #[serde(skip_serializing_if = "Option::is_none", default)]
128 #[doc = "RAM usage target for ballooning (in percent of total memory)"]
129 #[doc = ""]
130 pub ballooning_target: Option<BallooningTargetInt>,
131 #[serde(skip_serializing_if = "Option::is_none", default)]
132 #[doc = "A list of settings you want to delete."]
133 #[doc = ""]
134 pub delete: Option<String>,
135 #[serde(skip_serializing_if = "Option::is_none", default)]
136 #[doc = "Description for the Node. Shown in the web-interface node notes panel. This is saved as comment inside the configuration file."]
137 #[doc = ""]
138 pub description: Option<DescriptionStr>,
139 #[serde(skip_serializing_if = "Option::is_none", default)]
140 #[doc = "Prevent changes if current configuration file has different SHA1 digest. This can be used to prevent concurrent modifications."]
141 #[doc = ""]
142 pub digest: Option<DigestStr>,
143 #[serde(rename = "startall-onboot-delay")]
144 #[serde(skip_serializing_if = "Option::is_none", default)]
145 #[doc = "Initial delay in seconds, before starting all the Virtual Guests with on-boot enabled."]
146 #[doc = ""]
147 pub startall_onboot_delay: Option<StartallOnbootDelayInt>,
148 #[serde(skip_serializing_if = "Option::is_none", default)]
149 #[doc = "Node specific wake on LAN settings."]
150 #[doc = ""]
151 pub wakeonlan: Option<String>,
152 #[serde(
153 flatten,
154 deserialize_with = "crate::types::multi::deserialize_additional_data::<'_, PutParams, _, _>"
155 )]
156 pub additional_properties: ::std::collections::HashMap<String, ::serde_json::Value>,
157}
158impl crate::types::multi::Test for PutParams {
159 fn test_fn() -> fn(&str) -> bool {
160 fn the_test(input: &str) -> bool {
161 let array = [
162 <NumberedAcmedomains as crate::types::multi::NumberedItems>::key_matches
163 as fn(&str) -> bool,
164 ];
165 array.iter().any(|f| f(input))
166 }
167 the_test as _
168 }
169}
170#[derive(Clone, Debug, :: serde :: Serialize, :: serde :: Deserialize, PartialEq)]
171#[doc = "Return only a specific property from the node configuration."]
172#[doc = ""]
173pub enum Property {
174 #[serde(rename = "acme")]
175 Acme,
176 #[serde(rename = "acmedomain0")]
177 Acmedomain0,
178 #[serde(rename = "acmedomain1")]
179 Acmedomain1,
180 #[serde(rename = "acmedomain2")]
181 Acmedomain2,
182 #[serde(rename = "acmedomain3")]
183 Acmedomain3,
184 #[serde(rename = "acmedomain4")]
185 Acmedomain4,
186 #[serde(rename = "acmedomain5")]
187 Acmedomain5,
188 #[serde(rename = "ballooning-target")]
189 BallooningTarget,
190 #[serde(rename = "description")]
191 Description,
192 #[serde(rename = "startall-onboot-delay")]
193 StartallOnbootDelay,
194 #[serde(rename = "wakeonlan")]
195 Wakeonlan,
196}
197impl TryFrom<&str> for Property {
198 type Error = String;
199 fn try_from(value: &str) -> Result<Self, <Self as TryFrom<&str>>::Error> {
200 match value {
201 "acme" => Ok(Self::Acme),
202 "acmedomain0" => Ok(Self::Acmedomain0),
203 "acmedomain1" => Ok(Self::Acmedomain1),
204 "acmedomain2" => Ok(Self::Acmedomain2),
205 "acmedomain3" => Ok(Self::Acmedomain3),
206 "acmedomain4" => Ok(Self::Acmedomain4),
207 "acmedomain5" => Ok(Self::Acmedomain5),
208 "ballooning-target" => Ok(Self::BallooningTarget),
209 "description" => Ok(Self::Description),
210 "startall-onboot-delay" => Ok(Self::StartallOnbootDelay),
211 "wakeonlan" => Ok(Self::Wakeonlan),
212 v => Err(format!("Unknown variant {v}")),
213 }
214 }
215}
216#[derive(Default)]
217struct NumberedAcmedomains;
218impl crate::types::multi::NumberedItems for NumberedAcmedomains {
219 type Item = String;
220 const PREFIX: &'static str = "acmedomain";
221}
222#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
223pub struct BallooningTargetInt(i128);
224impl crate::types::bounded_integer::BoundedInteger for BallooningTargetInt {
225 const MIN: Option<i128> = Some(0i128);
226 const MAX: Option<i128> = Some(100i128);
227 const DEFAULT: Option<i128> = Some(80i128);
228 const TYPE_DESCRIPTION: &'static str = "an integer between 0 and 100";
229 fn get(&self) -> i128 {
230 self.0
231 }
232 fn new(value: i128) -> Result<Self, crate::types::bounded_integer::BoundedIntegerError> {
233 Self::validate(value)?;
234 Ok(Self(value))
235 }
236}
237impl std::convert::TryFrom<i128> for BallooningTargetInt {
238 type Error = crate::types::bounded_integer::BoundedIntegerError;
239 fn try_from(value: i128) -> Result<Self, Self::Error> {
240 crate::types::bounded_integer::BoundedInteger::new(value)
241 }
242}
243impl ::serde::Serialize for BallooningTargetInt {
244 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
245 where
246 S: ::serde::Serializer,
247 {
248 crate::types::bounded_integer::serialize_bounded_integer(self, serializer)
249 }
250}
251impl<'de> ::serde::Deserialize<'de> for BallooningTargetInt {
252 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
253 where
254 D: ::serde::Deserializer<'de>,
255 {
256 crate::types::bounded_integer::deserialize_bounded_integer(deserializer)
257 }
258}
259#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
260pub struct StartallOnbootDelayInt(i128);
261impl crate::types::bounded_integer::BoundedInteger for StartallOnbootDelayInt {
262 const MIN: Option<i128> = Some(0i128);
263 const MAX: Option<i128> = Some(300i128);
264 const DEFAULT: Option<i128> = Some(0i128);
265 const TYPE_DESCRIPTION: &'static str = "an integer between 0 and 300";
266 fn get(&self) -> i128 {
267 self.0
268 }
269 fn new(value: i128) -> Result<Self, crate::types::bounded_integer::BoundedIntegerError> {
270 Self::validate(value)?;
271 Ok(Self(value))
272 }
273}
274impl std::convert::TryFrom<i128> for StartallOnbootDelayInt {
275 type Error = crate::types::bounded_integer::BoundedIntegerError;
276 fn try_from(value: i128) -> Result<Self, Self::Error> {
277 crate::types::bounded_integer::BoundedInteger::new(value)
278 }
279}
280impl ::serde::Serialize for StartallOnbootDelayInt {
281 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
282 where
283 S: ::serde::Serializer,
284 {
285 crate::types::bounded_integer::serialize_bounded_integer(self, serializer)
286 }
287}
288impl<'de> ::serde::Deserialize<'de> for StartallOnbootDelayInt {
289 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
290 where
291 D: ::serde::Deserializer<'de>,
292 {
293 crate::types::bounded_integer::deserialize_bounded_integer(deserializer)
294 }
295}
296#[derive(Debug, Clone, PartialEq, PartialOrd)]
297pub struct DescriptionStr {
298 value: String,
299}
300impl crate::types::bounded_string::BoundedString for DescriptionStr {
301 const MIN_LENGTH: Option<usize> = None::<usize>;
302 const MAX_LENGTH: Option<usize> = Some(65536usize);
303 const DEFAULT: Option<&'static str> = None::<&'static str>;
304 const PATTERN: Option<&'static str> = None::<&'static str>;
305 const TYPE_DESCRIPTION: &'static str = "a string with length at most 65536";
306 fn get_value(&self) -> &str {
307 &self.value
308 }
309 fn new(value: String) -> Result<Self, crate::types::bounded_string::BoundedStringError> {
310 Self::validate(&value)?;
311 Ok(Self { value })
312 }
313}
314impl std::convert::TryFrom<String> for DescriptionStr {
315 type Error = crate::types::bounded_string::BoundedStringError;
316 fn try_from(value: String) -> Result<Self, Self::Error> {
317 crate::types::bounded_string::BoundedString::new(value)
318 }
319}
320impl ::serde::Serialize for DescriptionStr {
321 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
322 where
323 S: ::serde::Serializer,
324 {
325 crate::types::bounded_string::serialize_bounded_string(self, serializer)
326 }
327}
328impl<'de> ::serde::Deserialize<'de> for DescriptionStr {
329 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
330 where
331 D: ::serde::Deserializer<'de>,
332 {
333 crate::types::bounded_string::deserialize_bounded_string(deserializer)
334 }
335}
336#[derive(Debug, Clone, PartialEq, PartialOrd)]
337pub struct DigestStr {
338 value: String,
339}
340impl crate::types::bounded_string::BoundedString for DigestStr {
341 const MIN_LENGTH: Option<usize> = None::<usize>;
342 const MAX_LENGTH: Option<usize> = Some(40usize);
343 const DEFAULT: Option<&'static str> = None::<&'static str>;
344 const PATTERN: Option<&'static str> = None::<&'static str>;
345 const TYPE_DESCRIPTION: &'static str = "a string with length at most 40";
346 fn get_value(&self) -> &str {
347 &self.value
348 }
349 fn new(value: String) -> Result<Self, crate::types::bounded_string::BoundedStringError> {
350 Self::validate(&value)?;
351 Ok(Self { value })
352 }
353}
354impl std::convert::TryFrom<String> for DigestStr {
355 type Error = crate::types::bounded_string::BoundedStringError;
356 fn try_from(value: String) -> Result<Self, Self::Error> {
357 crate::types::bounded_string::BoundedString::new(value)
358 }
359}
360impl ::serde::Serialize for DigestStr {
361 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
362 where
363 S: ::serde::Serializer,
364 {
365 crate::types::bounded_string::serialize_bounded_string(self, serializer)
366 }
367}
368impl<'de> ::serde::Deserialize<'de> for DigestStr {
369 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
370 where
371 D: ::serde::Deserializer<'de>,
372 {
373 crate::types::bounded_string::deserialize_bounded_string(deserializer)
374 }
375}