nomad_client_rs/api/
namespace.rs

1use reqwest::Method;
2
3use crate::api::namespace::models::{NamespaceListParams, NamespaceRequest};
4use crate::models::namespace::Namespace;
5use crate::{ClientError, NomadClient};
6
7impl NomadClient {
8    pub async fn namespace_list(
9        &self,
10        params: Option<NamespaceListParams>,
11    ) -> Result<Vec<Namespace>, ClientError> {
12        let req = self.request(Method::GET, "/namespaces").query(&params);
13
14        self.send::<Vec<Namespace>>(req).await
15    }
16
17    pub async fn namespace_get(&self, namespace: &str) -> Result<Namespace, ClientError> {
18        let req = self.request(Method::GET, &format!("/namespace/{}", namespace));
19
20        self.send::<Namespace>(req).await
21    }
22
23    pub async fn namespace_create(&self, namespace: &NamespaceRequest) -> Result<(), ClientError> {
24        let req = self.request(Method::POST, "/namespace").json(namespace);
25
26        self.send_plain(req).await.map(|_| ())
27    }
28
29    pub async fn namespace_delete(&self, namespace: &str) -> Result<(), ClientError> {
30        let req = self.request(Method::DELETE, &format!("/namespace/{}", namespace));
31
32        self.send_plain(req).await.map(|_| ())
33    }
34}
35
36pub mod models {
37    use std::collections::HashMap;
38
39    use serde::Serialize;
40
41    #[derive(Debug, Default, Serialize)]
42    #[serde(rename_all = "PascalCase")]
43    pub struct NamespaceRequest {
44        pub name: String,
45        pub description: Option<String>,
46        pub meta: Option<HashMap<String, String>>,
47    }
48
49    #[derive(Debug, Default, Serialize)]
50    #[serde(rename_all = "camelCase")]
51    pub struct NamespaceListParams {
52        pub prefix: String,
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use crate::api::namespace::models::{NamespaceListParams, NamespaceRequest};
59    use crate::NomadClient;
60
61    #[tokio::test]
62    async fn namespace_list_should_return_list_of_namespaces() {
63        let client = NomadClient::default();
64
65        match client.namespace_list(None).await {
66            Ok(v) => assert!(!v.is_empty()),
67            Err(e) => panic!("{:#?}", e),
68        }
69    }
70
71    #[tokio::test]
72    async fn namespace_list_should_return_matching_namespaces_when_params_given() {
73        let client = NomadClient::default();
74        let param = NamespaceListParams {
75            prefix: "unknown".into(),
76        };
77
78        match client.namespace_list(Some(param)).await {
79            Ok(v) => assert!(v.is_empty()),
80            Err(e) => panic!("{:#?}", e),
81        }
82    }
83
84    #[tokio::test]
85    async fn namespace_get_should_return_namespace() {
86        let client = NomadClient::default();
87
88        match client.namespace_get("default").await {
89            Ok(v) => assert_eq!(v.name, Some("default".to_string())),
90            Err(e) => panic!("{:#?}", e),
91        }
92    }
93
94    #[tokio::test]
95    async fn namespace_create_should_create_namespace() {
96        let client = NomadClient::default();
97        let req = NamespaceRequest {
98            name: "example".into(),
99            meta: None,
100            description: None,
101        };
102
103        match client.namespace_create(&req).await {
104            Ok(_) => assert!(true),
105            Err(e) => panic!("{:#?}", e),
106        }
107    }
108
109    #[tokio::test]
110    async fn namespace_delete_should_delete_namespace() {
111        let client = NomadClient::default();
112        let req = NamespaceRequest {
113            name: "example".into(),
114            meta: None,
115            description: None,
116        };
117
118        let _ = client.namespace_create(&req).await;
119
120        match client.namespace_delete("example").await {
121            Ok(_) => assert!(true),
122            Err(e) => panic!("{:#?}", e),
123        }
124    }
125}