Skip to main content

fluvio_sc_schema/smartmodule/
client.rs

1use 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
15/// Experimental: this API is not finalized and may be changed in the future.
16pub 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}