1use std::str::FromStr;
16
17use crate::{
18 auth::AuthContext,
19 com::coralogixapis::views::v1::services::{
20 CreateViewRequest,
21 CreateViewResponse,
22 DeleteViewRequest,
23 DeleteViewResponse,
24 GetViewRequest,
25 ListViewsRequest,
26 ReplaceViewRequest,
27 ReplaceViewResponse,
28 views_service_client::ViewsServiceClient,
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::{
39 CustomTimeSelection,
40 Filter,
41 QuickTimeSelection,
42 SearchQuery,
43 SelectedFilters,
44 TimeSelection,
45 services::View,
46 time_selection::SelectionType,
47};
48
49use tokio::sync::Mutex;
50use tonic::{
51 metadata::MetadataMap,
52 transport::{
53 Channel,
54 ClientTlsConfig,
55 Endpoint,
56 },
57};
58
59use crate::CoralogixRegion;
60
61const FEATURE_GROUP_ID: &str = "data-exploration";
62
63pub struct ViewsClient {
66 teams_level_metadata_map: MetadataMap,
67 service_client: Mutex<ViewsServiceClient<Channel>>,
68}
69
70impl ViewsClient {
71 pub fn new(auth_context: AuthContext, region: CoralogixRegion) -> Result<Self> {
77 let channel: Channel = Endpoint::from_str(region.grpc_endpoint().as_str())?
78 .tls_config(ClientTlsConfig::new().with_native_roots())?
79 .connect_lazy();
80 let request_metadata: CallProperties = (&auth_context.user_level_api_key).into();
81 Ok(Self {
82 teams_level_metadata_map: request_metadata.to_metadata_map(),
83 service_client: Mutex::new(ViewsServiceClient::new(channel)),
84 })
85 }
86
87 pub async fn create(&self, view: View) -> Result<CreateViewResponse> {
92 let request = make_request_with_metadata(
93 CreateViewRequest {
94 name: view.name,
95 search_query: view.search_query,
96 time_selection: view.time_selection,
97 filters: view.filters,
98 folder_id: view.folder_id,
99 view_type: view.view_type,
100 },
101 &self.teams_level_metadata_map,
102 );
103 Ok(self
104 .service_client
105 .lock()
106 .await
107 .create_view(request)
108 .await
109 .map_err(|status| SdkApiError {
110 status,
111 endpoint: "/com.coralogixapis.views.v1.services.ViewsService/CreateView".into(),
112 feature_group: FEATURE_GROUP_ID.into(),
113 })?
114 .into_inner())
115 }
116
117 pub async fn replace(&self, view: View) -> Result<ReplaceViewResponse> {
122 let request = make_request_with_metadata(
123 ReplaceViewRequest { view: Some(view) },
124 &self.teams_level_metadata_map,
125 );
126 Ok(self
127 .service_client
128 .lock()
129 .await
130 .replace_view(request)
131 .await
132 .map_err(|status| SdkApiError {
133 status,
134 endpoint: "/com.coralogixapis.views.v1.services.ViewsService/ReplaceView"
135 .to_string(),
136 feature_group: FEATURE_GROUP_ID.to_string(),
137 })?
138 .into_inner())
139 }
140
141 pub async fn delete(&self, id: i32) -> Result<DeleteViewResponse> {
146 let request = make_request_with_metadata(
147 DeleteViewRequest { id: Some(id) },
148 &self.teams_level_metadata_map,
149 );
150 Ok(self
151 .service_client
152 .lock()
153 .await
154 .delete_view(request)
155 .await
156 .map_err(|status| SdkApiError {
157 status,
158 endpoint: "/com.coralogixapis.views.v1.services.ViewsService/DeleteView"
159 .to_string(),
160 feature_group: FEATURE_GROUP_ID.to_string(),
161 })?
162 .into_inner())
163 }
164
165 pub async fn get(&self, id: i32) -> Result<Option<View>> {
170 let request = make_request_with_metadata(
171 GetViewRequest { id: Some(id) },
172 &self.teams_level_metadata_map,
173 );
174
175 Ok(self
176 .service_client
177 .lock()
178 .await
179 .get_view(request)
180 .await
181 .map_err(|status| SdkApiError {
182 status,
183 endpoint: "/com.coralogixapis.views.v1.services.ViewsService/GetView".to_string(),
184 feature_group: FEATURE_GROUP_ID.to_string(),
185 })?
186 .into_inner()
187 .view)
188 }
189
190 pub async fn list(&self) -> Result<Vec<View>> {
195 let request =
196 make_request_with_metadata(ListViewsRequest {}, &self.teams_level_metadata_map);
197
198 Ok(self
199 .service_client
200 .lock()
201 .await
202 .list_views(request)
203 .await
204 .map_err(|status| SdkApiError {
205 status,
206 endpoint: "/com.coralogixapis.views.v1.services.ViewsService/ListViews".to_string(),
207 feature_group: FEATURE_GROUP_ID.to_string(),
208 })?
209 .into_inner()
210 .views)
211 }
212}