cx_sdk/client/
views_folders.rs1use std::str::FromStr;
16
17use crate::{
18    auth::AuthContext,
19    com::coralogixapis::views::v1::services::{
20        CreateViewFolderRequest,
21        CreateViewFolderResponse,
22        DeleteViewFolderRequest,
23        DeleteViewFolderResponse,
24        GetViewFolderRequest,
25        ListViewFoldersRequest,
26        ReplaceViewFolderRequest,
27        ReplaceViewFolderResponse,
28        views_folders_service_client::ViewsFoldersServiceClient,
29    },
30    error::{
31        Result,
32        SdkApiError,
33    },
34    metadata::CallProperties,
35    util::make_request_with_metadata,
36};
37
38pub use crate::com::coralogixapis::views::v1::ViewFolder;
39
40use tokio::sync::Mutex;
41use tonic::{
42    metadata::MetadataMap,
43    transport::{
44        Channel,
45        ClientTlsConfig,
46        Endpoint,
47    },
48};
49
50use crate::CoralogixRegion;
51
52const FEATURE_GROUP_ID: &str = "data-exploration";
53
54pub struct ViewFoldersClient {
57    teams_level_metadata_map: MetadataMap,
58    service_client: Mutex<ViewsFoldersServiceClient<Channel>>,
59}
60
61impl ViewFoldersClient {
62    pub fn new(auth_context: AuthContext, region: CoralogixRegion) -> Result<Self> {
68        let channel: Channel = Endpoint::from_str(region.grpc_endpoint().as_str())?
69            .tls_config(ClientTlsConfig::new().with_native_roots())?
70            .connect_lazy();
71        let request_metadata: CallProperties = (&auth_context.team_level_api_key).into();
72        Ok(Self {
73            teams_level_metadata_map: request_metadata.to_metadata_map(),
74            service_client: Mutex::new(ViewsFoldersServiceClient::new(channel)),
75        })
76    }
77
78    pub async fn create(&self, folder: ViewFolder) -> Result<CreateViewFolderResponse> {
83        let request = make_request_with_metadata(
84            CreateViewFolderRequest { name: folder.name },
85            &self.teams_level_metadata_map,
86        );
87        Ok(self
88            .service_client
89            .lock()
90            .await
91            .create_view_folder(request)
92            .await
93            .map_err(|status| SdkApiError {
94                status,
95                endpoint:
96                    "/com.coralogixapis.views.v1.services.ViewsFoldersService/CreateViewFolder"
97                        .into(),
98                feature_group: FEATURE_GROUP_ID.into(),
99            })?
100            .into_inner())
101    }
102
103    pub async fn replace(&self, folder: ViewFolder) -> Result<ReplaceViewFolderResponse> {
108        let request = make_request_with_metadata(
109            ReplaceViewFolderRequest {
110                folder: Some(folder),
111            },
112            &self.teams_level_metadata_map,
113        );
114        Ok(self
115            .service_client
116            .lock()
117            .await
118            .replace_view_folder(request)
119            .await
120            .map_err(|status| SdkApiError {
121                status,
122                endpoint: "/com.coralogixapis.views.v1.services.ViewFoldersService/ReplaceView"
123                    .to_string(),
124                feature_group: FEATURE_GROUP_ID.to_string(),
125            })?
126            .into_inner())
127    }
128
129    pub async fn delete(&self, id: String) -> Result<DeleteViewFolderResponse> {
134        let request = make_request_with_metadata(
135            DeleteViewFolderRequest { id: Some(id) },
136            &self.teams_level_metadata_map,
137        );
138        Ok(self
139            .service_client
140            .lock()
141            .await
142            .delete_view_folder(request)
143            .await
144            .map_err(|status| SdkApiError {
145                status,
146                endpoint:
147                    "/com.coralogixapis.views.v1.services.ViewsFoldersService/DeleteViewFolder"
148                        .to_string(),
149                feature_group: FEATURE_GROUP_ID.to_string(),
150            })?
151            .into_inner())
152    }
153
154    pub async fn get(&self, id: String) -> Result<Option<ViewFolder>> {
159        let request = make_request_with_metadata(
160            GetViewFolderRequest { id: Some(id) },
161            &self.teams_level_metadata_map,
162        );
163
164        Ok(self
165            .service_client
166            .lock()
167            .await
168            .get_view_folder(request)
169            .await
170            .map_err(|status| SdkApiError {
171                status,
172                endpoint: "/com.coralogixapis.views.v1.services.ViewsFoldersService/GetViewFolder"
173                    .to_string(),
174                feature_group: FEATURE_GROUP_ID.to_string(),
175            })?
176            .into_inner()
177            .folder)
178    }
179
180    pub async fn list(&self) -> Result<Vec<ViewFolder>> {
185        let request =
186            make_request_with_metadata(ListViewFoldersRequest {}, &self.teams_level_metadata_map);
187
188        Ok(self
189            .service_client
190            .lock()
191            .await
192            .list_view_folders(request)
193            .await
194            .map_err(|status| SdkApiError {
195                status,
196                endpoint:
197                    "/com.coralogixapis.views.v1.services.ViewsFoldersService/ListViewFolders"
198                        .to_string(),
199                feature_group: FEATURE_GROUP_ID.to_string(),
200            })?
201            .into_inner()
202            .folders)
203    }
204}