cometbft_rpc/endpoint/
abci_query.rs

1//! `/abci_query` endpoint JSON-RPC wrapper
2
3use cometbft::{abci::Code, block, merkle::proof::ProofOps, serializers};
4use serde::{Deserialize, Serialize};
5
6use crate::prelude::*;
7use crate::{dialect::Dialect, request::RequestMessage};
8
9/// Query the ABCI application for information
10#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
11pub struct Request {
12    /// Path to the data
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub path: Option<String>,
15
16    /// Data to query
17    #[serde(with = "serializers::bytes::hexstring")]
18    pub data: Vec<u8>,
19
20    /// Block height
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub height: Option<block::Height>,
23
24    /// Include proof in response
25    #[serde(default)]
26    pub prove: bool,
27}
28
29impl Request {
30    /// Create a new ABCI query request
31    pub fn new<D>(path: Option<String>, data: D, height: Option<block::Height>, prove: bool) -> Self
32    where
33        D: Into<Vec<u8>>,
34    {
35        Self {
36            path,
37            data: data.into(),
38            height,
39            prove,
40        }
41    }
42}
43
44impl RequestMessage for Request {
45    fn method(&self) -> crate::Method {
46        crate::Method::AbciQuery
47    }
48}
49
50impl<S: Dialect> crate::Request<S> for Request {
51    type Response = Response;
52}
53
54impl<S: Dialect> crate::SimpleRequest<S> for Request {
55    type Output = Response;
56}
57
58/// ABCI query response wrapper
59#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
60pub struct Response {
61    /// ABCI query results
62    pub response: AbciQuery,
63}
64
65impl crate::Response for Response {}
66
67/// ABCI query results
68#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
69#[serde(default)]
70pub struct AbciQuery {
71    /// Response code
72    pub code: Code,
73
74    /// Log value
75    pub log: String,
76
77    /// Info value
78    #[serde(default = "String::new")]
79    pub info: String,
80
81    /// Index
82    #[serde(with = "serializers::from_str")]
83    pub index: i64,
84
85    /// Key
86    #[serde(default, with = "serializers::bytes::base64string")]
87    pub key: Vec<u8>,
88
89    /// Value
90    #[serde(default, with = "serializers::bytes::base64string")]
91    pub value: Vec<u8>,
92
93    /// Proof (might be explicit null)
94    #[serde(alias = "proofOps")]
95    pub proof: Option<ProofOps>,
96
97    /// Block height
98    pub height: block::Height,
99
100    /// Codespace
101    #[serde(default = "String::new")]
102    pub codespace: String,
103}