solana/client/src/rpc_request.rs

177 lines
6.4 KiB
Rust
Raw Normal View History

2019-03-12 17:26:07 -07:00
use serde_json::{json, Value};
use std::{error, fmt};
2019-10-06 20:30:22 -07:00
#[derive(Debug, PartialEq, Eq, Hash)]
2019-03-12 17:26:07 -07:00
pub enum RpcRequest {
ConfirmTransaction,
DeregisterNode,
ValidatorExit,
2019-03-12 17:26:07 -07:00
GetAccountInfo,
GetBalance,
GetBlockTime,
GetClusterNodes,
GetConfirmedBlock,
GetConfirmedBlocks,
GetEpochInfo,
GetEpochSchedule,
GetGenesisHash,
2019-08-27 15:17:03 -07:00
GetInflation,
GetLeaderSchedule,
GetNumBlocksSinceSignatureConfirmation,
GetProgramAccounts,
2019-03-12 17:26:07 -07:00
GetRecentBlockhash,
GetSignatureStatus,
GetSlot,
GetSlotLeader,
GetStorageTurn,
GetStorageTurnRate,
GetSlotsPerSegment,
GetStoragePubkeysForSlot,
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::ConfirmTransaction => "confirmTransaction",
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",
2019-08-27 15:17:03 -07:00
RpcRequest::GetInflation => "getInflation",
RpcRequest::GetLeaderSchedule => "getLeaderSchedule",
RpcRequest::GetNumBlocksSinceSignatureConfirmation => {
"getNumBlocksSinceSignatureConfirmation"
}
RpcRequest::GetProgramAccounts => "getProgramAccounts",
2019-03-12 17:26:07 -07:00
RpcRequest::GetRecentBlockhash => "getRecentBlockhash",
RpcRequest::GetSignatureStatus => "getSignatureStatus",
RpcRequest::GetSlot => "getSlot",
RpcRequest::GetSlotLeader => "getSlotLeader",
RpcRequest::GetStorageTurn => "getStorageTurn",
RpcRequest::GetStorageTurnRate => "getStorageTurnRate",
RpcRequest::GetSlotsPerSegment => "getSlotsPerSegment",
RpcRequest::GetStoragePubkeysForSlot => "getStoragePubkeysForSlot",
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, Clone, PartialEq)]
pub enum RpcError {
RpcRequestError(String),
}
impl fmt::Display for RpcError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "invalid")
}
}
impl error::Error for RpcError {
fn description(&self) -> &str {
"invalid"
}
fn cause(&self) -> Option<&dyn error::Error> {
// Generic error, underlying cause isn't tracked.
None
}
}
#[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;
2019-12-18 21:26:11 -08:00
let request = test_request.build_request_json(1, json!([addr]));
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::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
}