solana/client/src/rpc_request.rs

177 lines
6.8 KiB
Rust
Raw Normal View History

2019-03-12 17:26:07 -07:00
use serde_json::{json, Value};
use thiserror::Error;
2019-10-06 20:30:22 -07:00
#[derive(Debug, PartialEq, Eq, Hash)]
2019-03-12 17:26:07 -07:00
pub enum RpcRequest {
DeregisterNode,
ValidatorExit,
2019-03-12 17:26:07 -07:00
GetAccountInfo,
GetBalance,
GetBlockTime,
GetClusterNodes,
GetConfirmedBlock,
GetConfirmedBlocks,
GetEpochInfo,
GetEpochSchedule,
GetGenesisHash,
GetIdentity,
2019-08-27 15:17:03 -07:00
GetInflation,
GetLeaderSchedule,
GetProgramAccounts,
2019-03-12 17:26:07 -07:00
GetRecentBlockhash,
GetFeeCalculatorForBlockhash,
GetFeeRateGovernor,
GetSignatureStatuses,
GetSlot,
GetSlotLeader,
GetStorageTurn,
GetStorageTurnRate,
GetSlotsPerSegment,
GetStoragePubkeysForSlot,
GetTotalSupply,
2019-03-12 17:26:07 -07:00
GetTransactionCount,
GetVersion,
GetVoteAccounts,
RegisterNode,
2019-03-12 17:26:07 -07:00
RequestAirdrop,
SendTransaction,
SignVote,
GetMinimumBalanceForRentExemption,
2020-01-21 12:05:04 -08:00
MinimumLedgerSlot,
2019-03-12 17:26:07 -07:00
}
impl RpcRequest {
2019-12-18 21:26:11 -08:00
pub(crate) fn build_request_json(&self, id: u64, params: Value) -> Value {
2019-03-12 17:26:07 -07:00
let jsonrpc = "2.0";
let method = match self {
RpcRequest::DeregisterNode => "deregisterNode",
RpcRequest::ValidatorExit => "validatorExit",
2019-03-12 17:26:07 -07:00
RpcRequest::GetAccountInfo => "getAccountInfo",
RpcRequest::GetBalance => "getBalance",
RpcRequest::GetBlockTime => "getBlockTime",
RpcRequest::GetClusterNodes => "getClusterNodes",
RpcRequest::GetConfirmedBlock => "getConfirmedBlock",
RpcRequest::GetConfirmedBlocks => "getConfirmedBlocks",
RpcRequest::GetEpochInfo => "getEpochInfo",
RpcRequest::GetEpochSchedule => "getEpochSchedule",
RpcRequest::GetGenesisHash => "getGenesisHash",
RpcRequest::GetIdentity => "getIdentity",
2019-08-27 15:17:03 -07:00
RpcRequest::GetInflation => "getInflation",
RpcRequest::GetLeaderSchedule => "getLeaderSchedule",
RpcRequest::GetProgramAccounts => "getProgramAccounts",
2019-03-12 17:26:07 -07:00
RpcRequest::GetRecentBlockhash => "getRecentBlockhash",
RpcRequest::GetFeeCalculatorForBlockhash => "getFeeCalculatorForBlockhash",
RpcRequest::GetFeeRateGovernor => "getFeeRateGovernor",
RpcRequest::GetSignatureStatuses => "getSignatureStatuses",
RpcRequest::GetSlot => "getSlot",
RpcRequest::GetSlotLeader => "getSlotLeader",
RpcRequest::GetStorageTurn => "getStorageTurn",
RpcRequest::GetStorageTurnRate => "getStorageTurnRate",
RpcRequest::GetSlotsPerSegment => "getSlotsPerSegment",
RpcRequest::GetStoragePubkeysForSlot => "getStoragePubkeysForSlot",
RpcRequest::GetTotalSupply => "getTotalSupply",
2019-03-12 17:26:07 -07:00
RpcRequest::GetTransactionCount => "getTransactionCount",
RpcRequest::GetVersion => "getVersion",
RpcRequest::GetVoteAccounts => "getVoteAccounts",
RpcRequest::RegisterNode => "registerNode",
2019-03-12 17:26:07 -07:00
RpcRequest::RequestAirdrop => "requestAirdrop",
RpcRequest::SendTransaction => "sendTransaction",
RpcRequest::SignVote => "signVote",
RpcRequest::GetMinimumBalanceForRentExemption => "getMinimumBalanceForRentExemption",
2020-01-21 12:05:04 -08:00
RpcRequest::MinimumLedgerSlot => "minimumLedgerSlot",
2019-03-12 17:26:07 -07:00
};
2019-12-18 21:26:11 -08:00
json!({
2019-03-12 17:26:07 -07:00
"jsonrpc": jsonrpc,
"id": id,
"method": method,
2019-12-18 21:26:11 -08:00
"params": params,
})
2019-03-12 17:26:07 -07:00
}
}
#[derive(Debug, Error)]
2019-03-12 17:26:07 -07:00
pub enum RpcError {
#[error("rpc request error: {0}")]
2019-03-12 17:26:07 -07:00
RpcRequestError(String),
#[error("parse error: expected {0}")]
ParseError(String), /* "expected" */
// Anything in a `ForUser` needs to die. The caller should be
// deciding what to tell their user
#[error("{0}")]
ForUser(String), /* "direct-to-user message" */
2019-03-12 17:26:07 -07:00
}
#[cfg(test)]
mod tests {
use super::*;
2019-12-18 21:26:11 -08:00
use solana_sdk::commitment_config::{CommitmentConfig, CommitmentLevel};
2019-03-12 17:26:07 -07:00
#[test]
fn test_build_request_json() {
let test_request = RpcRequest::GetAccountInfo;
let addr = json!("deadbeefXjn8o3yroDHxUtKsZZgoy4GPkPPXfouKNHhx");
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, json!([addr.clone()]));
2019-03-12 17:26:07 -07:00
assert_eq!(request["method"], "getAccountInfo");
assert_eq!(request["params"], json!([addr]));
2019-03-12 17:26:07 -07:00
let test_request = RpcRequest::GetBalance;
let request = test_request.build_request_json(1, json!([addr.clone()]));
2019-03-12 17:26:07 -07:00
assert_eq!(request["method"], "getBalance");
let test_request = RpcRequest::GetEpochInfo;
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, Value::Null);
assert_eq!(request["method"], "getEpochInfo");
2019-08-27 15:17:03 -07:00
let test_request = RpcRequest::GetInflation;
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, Value::Null);
2019-08-27 15:17:03 -07:00
assert_eq!(request["method"], "getInflation");
2019-03-12 17:26:07 -07:00
let test_request = RpcRequest::GetRecentBlockhash;
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, Value::Null);
2019-03-12 17:26:07 -07:00
assert_eq!(request["method"], "getRecentBlockhash");
let test_request = RpcRequest::GetFeeCalculatorForBlockhash;
let request = test_request.build_request_json(1, json!([addr.clone()]));
assert_eq!(request["method"], "getFeeCalculatorForBlockhash");
let test_request = RpcRequest::GetFeeRateGovernor;
let request = test_request.build_request_json(1, Value::Null);
assert_eq!(request["method"], "getFeeRateGovernor");
let test_request = RpcRequest::GetSlot;
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, Value::Null);
assert_eq!(request["method"], "getSlot");
2019-03-12 17:26:07 -07:00
let test_request = RpcRequest::GetTransactionCount;
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, Value::Null);
2019-03-12 17:26:07 -07:00
assert_eq!(request["method"], "getTransactionCount");
let test_request = RpcRequest::RequestAirdrop;
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, Value::Null);
2019-03-12 17:26:07 -07:00
assert_eq!(request["method"], "requestAirdrop");
let test_request = RpcRequest::SendTransaction;
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, Value::Null);
2019-03-12 17:26:07 -07:00
assert_eq!(request["method"], "sendTransaction");
}
#[test]
fn test_build_request_json_config_options() {
let commitment_config = CommitmentConfig {
commitment: CommitmentLevel::Max,
};
let addr = json!("deadbeefXjn8o3yroDHxUtKsZZgoy4GPkPPXfouKNHhx");
// Test request with CommitmentConfig and no params
let test_request = RpcRequest::GetRecentBlockhash;
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, json!([commitment_config.clone()]));
assert_eq!(request["params"], json!([commitment_config.clone()]));
// Test request with CommitmentConfig and params
let test_request = RpcRequest::GetBalance;
let request =
2019-12-18 21:26:11 -08:00
test_request.build_request_json(1, json!([addr.clone(), commitment_config.clone()]));
assert_eq!(request["params"], json!([addr, commitment_config]));
}
2019-03-12 17:26:07 -07:00
}