nomad_client_rs/api/
namespace.rs1use 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(¶ms);
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}