nomad_client_rs/api/
variable.rs1use reqwest::Method;
2
3use crate::api::path_combine;
4use crate::api::variable::models::{
5 VariableCreateRequest, VariableDeleteParams, VariableGetParams, VariableListParams,
6};
7use crate::models::variable::Variable;
8use crate::{ClientError, NomadClient};
9
10impl NomadClient {
11 pub async fn variables_list(
12 &self,
13 params: &VariableListParams,
14 ) -> Result<Vec<Variable>, ClientError> {
15 let req = self.request(Method::GET, "/vars").query(¶ms);
16
17 self.send::<Vec<Variable>>(req).await
18 }
19
20 pub async fn variable_get(
21 &self,
22 var_path: &str,
23 params: &VariableGetParams,
24 ) -> Result<Variable, ClientError> {
25 let req = self
26 .request(Method::GET, &path_combine("/var", var_path))
27 .query(¶ms);
28
29 self.send::<Variable>(req).await
30 }
31
32 pub async fn variable_create(
33 &self,
34 var_path: &str,
35 req: &VariableCreateRequest,
36 ) -> Result<Variable, ClientError> {
37 let req = self
38 .request(Method::PUT, &path_combine("/var", var_path))
39 .json(&req);
40
41 self.send::<Variable>(req).await
42 }
43
44 pub async fn variable_delete(
45 &self,
46 var_path: &str,
47 params: &VariableDeleteParams,
48 ) -> Result<(), ClientError> {
49 let req = self
50 .request(Method::DELETE, &path_combine("/var", var_path))
51 .query(¶ms);
52
53 self.send_plain(req).await.map(|_| ())
54 }
55}
56
57pub mod models {
58 use std::collections::HashMap;
59
60 use serde::Serialize;
61
62 #[derive(Debug, Default, Serialize)]
63 #[serde(rename_all = "camelCase")]
64 pub struct VariableListParams {
65 pub prefix: Option<String>,
66 #[serde(rename = "next_token")]
67 pub next_token: Option<String>,
68 #[serde(rename = "per_page")]
69 pub per_page: Option<u64>,
70 pub filter: Option<String>,
71 pub namespace: Option<String>,
72 }
73
74 #[derive(Debug, Default, Serialize)]
75 #[serde(rename_all = "camelCase")]
76 pub struct VariableGetParams {
77 pub namespace: Option<String>,
78 }
79
80 #[derive(Debug, Default, Serialize)]
81 #[serde(rename_all = "PascalCase")]
82 pub struct VariableCreateRequest {
83 pub namespace: String,
84 pub path: String,
85 pub items: HashMap<String, String>,
86 }
87
88 #[derive(Debug, Default, Serialize)]
89 #[serde(rename_all = "camelCase")]
90 pub struct VariableDeleteParams {
91 pub namespace: Option<String>,
92 }
93}
94
95#[cfg(test)]
96mod tests {
97 use crate::api::namespace::models::{NamespaceListParams, NamespaceRequest};
98 use crate::api::variable::models::{VariableCreateRequest, VariableDeleteParams};
99 use crate::models::variable::Variable;
100 use crate::{ClientError, NomadClient};
101
102 #[tokio::test]
103 async fn variable_create() {
104 let client = NomadClient::default();
105
106 let mut request = VariableCreateRequest::default();
107 request.items.insert("key".to_string(), "value".to_string());
108
109 match client.variable_create("testVariable", &request).await {
110 Ok(_) => assert!(true),
111 Err(err) => panic!("{err}"),
112 }
113 }
114
115 #[tokio::test]
116 async fn variable_delete_should_return_void() {
117 let client = NomadClient::default();
118
119 match client
120 .variable_delete("thisDoesNotExist", &VariableDeleteParams::default())
121 .await
122 {
123 Ok(v) => assert!(true),
124 Err(e) => panic!("{:#?}", e),
125 }
126
127 match client
128 .variable_delete("testVariable", &VariableDeleteParams::default())
129 .await
130 {
131 Ok(_) => assert!(true),
132 Err(err) => panic!("{err}"),
133 }
134 }
135}