ibc_query/core/connection/
service.rs

1//! [`ConnectionQueryService`](ConnectionQueryService) takes a generic `I` to
2//! store `ibc_context` that implements [`QueryContext`](QueryContext). `I` must
3//! be a type where writes from one thread are readable from another. This means
4//! using `Arc<Mutex<_>>` or `Arc<RwLock<_>>` in most cases.
5
6use ibc::core::host::ConsensusStateRef;
7use ibc::core::primitives::prelude::*;
8use ibc_proto::google::protobuf::Any;
9use ibc_proto::ibc::core::connection::v1::query_server::Query as ConnectionQuery;
10use ibc_proto::ibc::core::connection::v1::{
11    QueryClientConnectionsRequest, QueryClientConnectionsResponse,
12    QueryConnectionClientStateRequest, QueryConnectionClientStateResponse,
13    QueryConnectionConsensusStateRequest, QueryConnectionConsensusStateResponse,
14    QueryConnectionParamsRequest, QueryConnectionParamsResponse, QueryConnectionRequest,
15    QueryConnectionResponse, QueryConnectionsRequest, QueryConnectionsResponse,
16};
17use tonic::{Request, Response, Status};
18
19use super::{
20    query_client_connections, query_connection, query_connection_client_state,
21    query_connection_consensus_state, query_connection_params, query_connections,
22};
23use crate::core::context::QueryContext;
24use crate::utils::{IntoDomain, IntoResponse, TryIntoDomain};
25
26// TODO(rano): currently the services don't support pagination, so we return all the results.
27
28/// The generic `I` must be a type where writes from one thread are readable
29/// from another. This means using `Arc<Mutex<_>>` or `Arc<RwLock<_>>` in most
30/// cases.
31pub struct ConnectionQueryService<I>
32where
33    I: QueryContext + Send + Sync + 'static,
34    ConsensusStateRef<I>: Into<Any>,
35{
36    ibc_context: I,
37}
38
39impl<I> ConnectionQueryService<I>
40where
41    I: QueryContext + Send + Sync + 'static,
42    ConsensusStateRef<I>: Into<Any>,
43{
44    /// The parameter `ibc_context` must be a type where writes from one thread
45    /// are readable from another. This means using `Arc<Mutex<_>>` or
46    /// `Arc<RwLock<_>>` in most cases.
47    pub fn new(ibc_context: I) -> Self {
48        Self { ibc_context }
49    }
50}
51
52#[tonic::async_trait]
53impl<I> ConnectionQuery for ConnectionQueryService<I>
54where
55    I: QueryContext + Send + Sync + 'static,
56    ConsensusStateRef<I>: Into<Any>,
57{
58    async fn connection(
59        &self,
60        request: Request<QueryConnectionRequest>,
61    ) -> Result<Response<QueryConnectionResponse>, Status> {
62        query_connection(&self.ibc_context, &request.try_into_domain()?)?.into_response()
63    }
64
65    async fn connections(
66        &self,
67        request: Request<QueryConnectionsRequest>,
68    ) -> Result<Response<QueryConnectionsResponse>, Status> {
69        query_connections(&self.ibc_context, &request.into_domain())?.into_response()
70    }
71
72    async fn client_connections(
73        &self,
74        request: Request<QueryClientConnectionsRequest>,
75    ) -> Result<Response<QueryClientConnectionsResponse>, Status> {
76        query_client_connections(&self.ibc_context, &request.try_into_domain()?)?.into_response()
77    }
78
79    async fn connection_client_state(
80        &self,
81        request: Request<QueryConnectionClientStateRequest>,
82    ) -> Result<Response<QueryConnectionClientStateResponse>, Status> {
83        query_connection_client_state(&self.ibc_context, &request.try_into_domain()?)?
84            .into_response()
85    }
86
87    async fn connection_consensus_state(
88        &self,
89        request: Request<QueryConnectionConsensusStateRequest>,
90    ) -> Result<Response<QueryConnectionConsensusStateResponse>, Status> {
91        query_connection_consensus_state(&self.ibc_context, &request.try_into_domain()?)?
92            .into_response()
93    }
94
95    async fn connection_params(
96        &self,
97        request: Request<QueryConnectionParamsRequest>,
98    ) -> Result<Response<QueryConnectionParamsResponse>, Status> {
99        query_connection_params(&self.ibc_context, &request.into_domain())?.into_response()
100    }
101}