fluvio_sc_schema/smartmodule/
client.rs1use tracing::{trace, debug};
2use anyhow::{anyhow, Result};
3
4use fluvio_controlplane_metadata::smartmodule::SmartModuleSpec;
5use fluvio_socket::{VersionedSerialSocket, MultiplexerSocket, SerialFrame};
6
7use crate::{
8 objects::{
9 ListFilter, Metadata, ListRequest, ObjectApiListRequest, COMMON_VERSION, ListResponse,
10 },
11 TryEncodableFrom,
12};
13pub use fluvio_socket::{ClientConfig, SocketError};
14
15pub struct SmartModuleApiClient {
17 socket: VersionedSerialSocket,
18}
19
20impl SmartModuleApiClient {
21 pub async fn connect_with_config(config: ClientConfig) -> Result<Self> {
22 let inner_client = config.connect().await?;
23 debug!(addr = %inner_client.config().addr(), "connected to cluster");
24
25 let (socket, config, versions) = inner_client.split();
26 let socket = MultiplexerSocket::shared(socket);
27 let versioned_socket = VersionedSerialSocket::new(socket, config, versions);
28
29 Ok(Self {
30 socket: versioned_socket,
31 })
32 }
33
34 pub async fn get<F>(&self, name: F) -> Result<Option<SmartModuleSpec>>
35 where
36 ListFilter: From<F>,
37 {
38 let mut smartmodule_spec_list = self.list_with_params::<F>(vec![name], false).await?;
39 Ok(smartmodule_spec_list.pop().map(|m| m.spec))
40 }
41
42 pub async fn list_with_params<F>(
43 &self,
44 filters: Vec<F>,
45 summary: bool,
46 ) -> Result<Vec<Metadata<SmartModuleSpec>>>
47 where
48 ListFilter: From<F>,
49 {
50 let filter_list: Vec<ListFilter> = filters.into_iter().map(Into::into).collect();
51 let list_request: ListRequest<SmartModuleSpec> = ListRequest::new(filter_list, summary);
52
53 let list_request = ObjectApiListRequest::try_encode_from(list_request, COMMON_VERSION)?;
54 let response = self.socket.send_receive(list_request).await?;
55 trace!("list response: {:#?}", response);
56 Ok((response
57 .downcast()?
58 .ok_or(anyhow!("not smartmodule list"))? as ListResponse<SmartModuleSpec>)
59 .inner())
60 }
61}