1use crate::{
2 p2p::connection::P2pConnectionResponse,
3 rpc::{
4 RpcActionStatsGetResponse, RpcBestChainResponse, RpcBlockProducerStatsGetResponse,
5 RpcConsensusTimeGetResponse, RpcDiscoveryBoostrapStatsResponse,
6 RpcDiscoveryRoutingTableResponse, RpcGenesisBlockResponse, RpcGetBlockResponse,
7 RpcHealthCheckResponse, RpcHeartbeatGetResponse, RpcId,
8 RpcLedgerAccountDelegatorsGetResponse, RpcLedgerAccountsResponse,
9 RpcLedgerSlimAccountsResponse, RpcLedgerStatusGetResponse, RpcMessageProgressResponse,
10 RpcP2pConnectionOutgoingResponse, RpcPeersGetResponse, RpcPooledUserCommandsResponse,
11 RpcPooledZkappCommandsResponse, RpcReadinessCheckResponse, RpcScanStateSummaryGetResponse,
12 RpcSnarkPoolCompletedJobsResponse, RpcSnarkPoolGetResponse, RpcSnarkPoolJobGetResponse,
13 RpcSnarkPoolPendingJobsGetResponse, RpcSnarkerConfigGetResponse,
14 RpcSnarkerJobCommitResponse, RpcSnarkerJobSpecResponse, RpcSnarkerWorkersResponse,
15 RpcStatusGetResponse, RpcSyncStatsGetResponse, RpcTransactionInjectResponse,
16 RpcTransactionPoolResponse, RpcTransactionStatusGetResponse,
17 RpcTransitionFrontierUserCommandsResponse,
18 },
19 State,
20};
21use openmina_core::consensus::ConsensusConstants;
22use serde::{Deserialize, Serialize};
23use thiserror::Error;
24
25#[derive(Error, Serialize, Deserialize, Debug, Clone)]
26pub enum RespondError {
27 #[error("unknown rpc id")]
28 UnknownRpcId,
29 #[error("unexpected response type")]
30 UnexpectedResponseType,
31 #[error("responding failed")]
32 RespondingFailed,
33 #[error("{0}")]
34 Custom(String),
35}
36
37macro_rules! from_error {
38 ($error:ty) => {
39 impl From<$error> for RespondError {
40 fn from(value: $error) -> Self {
41 RespondError::Custom(value.to_string())
42 }
43 }
44 };
45}
46
47from_error!(serde_json::Error);
48
49pub trait RpcService {
50 fn respond_state_get(
51 &mut self,
52 rpc_id: RpcId,
53 response: (&State, Option<&str>),
54 ) -> Result<(), RespondError>;
55 fn respond_status_get(
56 &mut self,
57 rpc_id: RpcId,
58 response: RpcStatusGetResponse,
59 ) -> Result<(), RespondError>;
60 fn respond_heartbeat_get(
61 &mut self,
62 rpc_id: RpcId,
63 response: RpcHeartbeatGetResponse,
64 ) -> Result<(), RespondError>;
65 fn respond_action_stats_get(
66 &mut self,
67 rpc_id: RpcId,
68 response: RpcActionStatsGetResponse,
69 ) -> Result<(), RespondError>;
70 fn respond_sync_stats_get(
71 &mut self,
72 rpc_id: RpcId,
73 response: RpcSyncStatsGetResponse,
74 ) -> Result<(), RespondError>;
75 fn respond_block_producer_stats_get(
76 &mut self,
77 rpc_id: RpcId,
78 response: RpcBlockProducerStatsGetResponse,
79 ) -> Result<(), RespondError>;
80 fn respond_message_progress_stats_get(
81 &mut self,
82 rpc_id: RpcId,
83 response: RpcMessageProgressResponse,
84 ) -> Result<(), RespondError>;
85 fn respond_peers_get(
86 &mut self,
87 rpc_id: RpcId,
88 response: RpcPeersGetResponse,
89 ) -> Result<(), RespondError>;
90 fn respond_p2p_connection_outgoing(
91 &mut self,
92 rpc_id: RpcId,
93 response: RpcP2pConnectionOutgoingResponse,
94 ) -> Result<(), RespondError>;
95 fn respond_p2p_connection_incoming_answer(
96 &mut self,
97 rpc_id: RpcId,
98 response: P2pConnectionResponse,
99 ) -> Result<(), RespondError>;
100 fn respond_p2p_connection_incoming(
101 &mut self,
102 rpc_id: RpcId,
103 response: Result<(), String>,
104 ) -> Result<(), RespondError>;
105 fn respond_scan_state_summary_get(
106 &mut self,
107 rpc_id: RpcId,
108 response: RpcScanStateSummaryGetResponse,
109 ) -> Result<(), RespondError>;
110 fn respond_snark_pool_get(
111 &mut self,
112 rpc_id: RpcId,
113 response: RpcSnarkPoolGetResponse,
114 ) -> Result<(), RespondError>;
115 fn respond_snark_pool_job_get(
116 &mut self,
117 rpc_id: RpcId,
118 response: RpcSnarkPoolJobGetResponse,
119 ) -> Result<(), RespondError>;
120 fn respond_snark_pool_completed_jobs_get(
121 &mut self,
122 rpc_id: RpcId,
123 response: RpcSnarkPoolCompletedJobsResponse,
124 ) -> Result<(), RespondError>;
125 fn respond_snark_pool_pending_jobs_get(
126 &mut self,
127 rpc_id: RpcId,
128 response: RpcSnarkPoolPendingJobsGetResponse,
129 ) -> Result<(), RespondError>;
130 fn respond_snarker_config_get(
131 &mut self,
132 rpc_id: RpcId,
133 response: RpcSnarkerConfigGetResponse,
134 ) -> Result<(), RespondError>;
135 fn respond_snarker_job_commit(
136 &mut self,
137 rpc_id: RpcId,
138 response: RpcSnarkerJobCommitResponse,
139 ) -> Result<(), RespondError>;
140 fn respond_snarker_job_spec(
141 &mut self,
142 rpc_id: RpcId,
143 response: RpcSnarkerJobSpecResponse,
144 ) -> Result<(), RespondError>;
145 fn respond_snarker_workers(
146 &mut self,
147 rpc_id: RpcId,
148 response: RpcSnarkerWorkersResponse,
149 ) -> Result<(), RespondError>;
150 fn respond_health_check(
151 &mut self,
152 rpc_id: RpcId,
153 response: RpcHealthCheckResponse,
154 ) -> Result<(), RespondError>;
155 fn respond_discovery_routing_table(
156 &mut self,
157 rpc_id: RpcId,
158 response: RpcDiscoveryRoutingTableResponse,
159 ) -> Result<(), RespondError>;
160 fn respond_discovery_bootstrap_stats(
161 &mut self,
162 rpc_id: RpcId,
163 response: RpcDiscoveryBoostrapStatsResponse,
164 ) -> Result<(), RespondError>;
165 fn respond_readiness_check(
166 &mut self,
167 rpc_id: RpcId,
168 response: RpcReadinessCheckResponse,
169 ) -> Result<(), RespondError>;
170 fn respond_transaction_pool(
171 &mut self,
172 rpc_id: RpcId,
173 response: RpcTransactionPoolResponse,
174 ) -> Result<(), RespondError>;
175 fn respond_ledger_slim_accounts(
176 &mut self,
177 rpc_id: RpcId,
178 response: RpcLedgerSlimAccountsResponse,
179 ) -> Result<(), RespondError>;
180 fn respond_ledger_accounts(
181 &mut self,
182 rpc_id: RpcId,
183 response: RpcLedgerAccountsResponse,
184 ) -> Result<(), RespondError>;
185 fn respond_transaction_inject(
186 &mut self,
187 rpc_id: RpcId,
188 response: RpcTransactionInjectResponse,
189 ) -> Result<(), RespondError>;
190 fn respond_transition_frontier_commands(
191 &mut self,
192 rpc_id: RpcId,
193 response: RpcTransitionFrontierUserCommandsResponse,
194 ) -> Result<(), RespondError>;
195 fn respond_best_chain(
196 &mut self,
197 rpc_id: RpcId,
198 response: RpcBestChainResponse,
199 ) -> Result<(), RespondError>;
200 fn respond_consensus_constants(
201 &mut self,
202 rpc_id: RpcId,
203 response: ConsensusConstants,
204 ) -> Result<(), RespondError>;
205 fn respond_transaction_status(
206 &mut self,
207 rpc_id: RpcId,
208 response: RpcTransactionStatusGetResponse,
209 ) -> Result<(), RespondError>;
210 fn respond_block_get(
211 &mut self,
212 rpc_id: RpcId,
213 response: RpcGetBlockResponse,
214 ) -> Result<(), RespondError>;
215 fn respond_pooled_user_commands(
216 &mut self,
217 rpc_id: RpcId,
218 response: RpcPooledUserCommandsResponse,
219 ) -> Result<(), RespondError>;
220 fn respond_pooled_zkapp_commands(
221 &mut self,
222 rpc_id: RpcId,
223 response: RpcPooledZkappCommandsResponse,
224 ) -> Result<(), RespondError>;
225 fn respond_genesis_block(
226 &mut self,
227 rpc_id: RpcId,
228 response: RpcGenesisBlockResponse,
229 ) -> Result<(), RespondError>;
230 fn respond_consensus_time_get(
231 &mut self,
232 rpc_id: RpcId,
233 response: RpcConsensusTimeGetResponse,
234 ) -> Result<(), RespondError>;
235 fn respond_ledger_status_get(
236 &mut self,
237 rpc_id: RpcId,
238 response: RpcLedgerStatusGetResponse,
239 ) -> Result<(), RespondError>;
240 fn respond_ledger_account_delegators_get(
241 &mut self,
242 rpc_id: RpcId,
243 response: RpcLedgerAccountDelegatorsGetResponse,
244 ) -> Result<(), RespondError>;
245}