nomad_client_rs/api/
variable.rs

1use 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(&params);
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(&params);
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(&params);
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}