near_api/common/query/
query_rpc.rs1use async_trait::async_trait;
2use near_openapi_client::types::{
3 JsonRpcRequestForQuery, JsonRpcRequestForQueryMethod,
4 JsonRpcResponseForRpcQueryResponseAndRpcError, RpcError, RpcQueryResponse,
5};
6
7use crate::{
8 advanced::{query_request::QueryRequest, RpcType},
9 common::utils::is_critical_query_error,
10 config::RetryResponse,
11 errors::SendRequestError,
12 NetworkConfig,
13};
14use near_api_types::Reference;
15
16#[derive(Clone, Debug)]
17pub struct SimpleQueryRpc {
18 pub request: QueryRequest,
19}
20
21#[async_trait]
22impl RpcType for SimpleQueryRpc {
23 type RpcReference = Reference;
24 type Response = RpcQueryResponse;
25 type Error = RpcError;
26 async fn send_query(
27 &self,
28 client: &near_openapi_client::Client,
29 _network: &NetworkConfig,
30 reference: &Reference,
31 ) -> RetryResponse<RpcQueryResponse, SendRequestError<RpcError>> {
32 let request = self.request.clone().to_rpc_query_request(reference.clone());
33 let response = client
34 .query(&JsonRpcRequestForQuery {
35 id: "0".to_string(),
36 jsonrpc: "2.0".to_string(),
37 method: JsonRpcRequestForQueryMethod::Query,
38 params: request,
39 })
40 .await
41 .map(|r| r.into_inner());
42 match response {
43 Ok(JsonRpcResponseForRpcQueryResponseAndRpcError::Variant0 { result, .. }) => {
44 RetryResponse::Ok(result)
45 }
46 Ok(JsonRpcResponseForRpcQueryResponseAndRpcError::Variant1 { error, .. }) => {
47 if is_critical_query_error(&error) {
48 RetryResponse::Critical(SendRequestError::ServerError(error))
49 } else {
50 RetryResponse::Retry(SendRequestError::ServerError(error))
51 }
52 }
53 Err(err) => RetryResponse::Critical(SendRequestError::ClientError(err)),
54 }
55 }
56}