lores_p2panda_client/
lib.rs1use tonic::transport::Channel;
2
3pub mod proto {
4 tonic::include_proto!("lores.panda.v1");
5}
6
7use proto::{
8 ListRegionsRequest, ListRegionsResponse, OperationEvent, PublishRequest, PublishResponse,
9 SubscribeRequest, panda_client::PandaClient as TonicPandaClient,
10};
11use tonic::{Response, Status, Streaming};
12
13pub struct PandaClient {
15 inner: TonicPandaClient<Channel>,
16}
17
18impl PandaClient {
19 pub async fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error>
28 where
29 D: TryInto<tonic::transport::Endpoint>,
30 D::Error: Into<Box<dyn std::error::Error + Send + Sync>>,
31 {
32 let inner = TonicPandaClient::connect(dst).await?;
33 Ok(Self { inner })
34 }
35
36 pub fn connect_lazy<D>(dst: D) -> Result<Self, tonic::transport::Error>
40 where
41 D: TryInto<tonic::transport::Endpoint>,
42 D::Error: Into<Box<dyn std::error::Error + Send + Sync>>,
43 {
44 let endpoint = tonic::transport::Endpoint::new(dst)?;
45 let inner = TonicPandaClient::new(endpoint.connect_lazy());
46 Ok(Self { inner })
47 }
48
49 pub async fn publish(
54 &mut self,
55 region_id: [u8; 32],
56 app_namespace: impl Into<String>,
57 payload: impl Into<Vec<u8>>,
58 ) -> Result<Response<PublishResponse>, Status> {
59 let request = PublishRequest {
60 region_id: region_id.to_vec(),
61 app_namespace: app_namespace.into(),
62 payload: payload.into(),
63 };
64 self.inner.publish(request).await
65 }
66
67 pub async fn subscribe(
72 &mut self,
73 region_id: [u8; 32],
74 app_namespace: impl Into<String>,
75 ) -> Result<Response<Streaming<OperationEvent>>, Status> {
76 let request = SubscribeRequest {
77 region_id: region_id.to_vec(),
78 app_namespace: app_namespace.into(),
79 };
80 self.inner.subscribe(request).await
81 }
82
83 pub async fn list_regions(&mut self) -> Result<Response<ListRegionsResponse>, Status> {
85 self.inner.list_regions(ListRegionsRequest {}).await
86 }
87}