use std::collections::HashMap;
use crate::client::Client;
use crate::command::{request::request, CallableCommand};
use serde::{Deserialize, Serialize};
use serde_json::value::to_raw_value;
pub type TransactionId = String;
#[derive(Serialize, Deserialize, Debug)]
#[serde(untagged)]
pub enum GetRawMempoolCommandResponse {
TransacationIds(Vec<TransactionId>),
TransactionIdsWithSequence(TransactionIdsWithSequence),
Transactions(HashMap<TransactionId, Transaction>),
}
#[derive(Serialize, Deserialize, Debug)]
pub struct TransactionIdsWithSequence {
pub txids: Vec<TransactionId>,
pub mempool_sequence: u64,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Fees {
pub base: f64,
pub modified: f64,
pub ancestor: f64,
pub descendant: f64,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Transaction {
pub vsize: u64,
pub weight: u64,
pub fee: f64,
pub modifiedfee: f64,
pub time: u64,
pub height: u64,
pub descendantcount: u64,
pub descendantsize: u64,
pub descendantfees: f64,
pub ancestorcount: u64,
pub ancestorsize: u64,
pub ancestorfees: u64,
pub wtxid: String,
pub fees: Fees,
pub depends: Vec<String>,
pub spentby: Vec<String>,
#[serde(alias = "bip125-replaceable")]
pub bip125_replaceable: bool,
pub unbroadcast: bool,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Transactions(pub HashMap<TransactionId, Transaction>);
pub struct GetRawMempoolCommand {
verbose: bool,
mempool_sequence: bool,
}
impl GetRawMempoolCommand {
pub fn new() -> Self {
GetRawMempoolCommand {
verbose: false,
mempool_sequence: false,
}
}
pub fn set_verbose(mut self, verbose: bool) -> Self {
self.verbose = verbose;
self
}
pub fn set_mempool_sequence(mut self, mempool_sequence: bool) -> Self {
self.mempool_sequence = mempool_sequence;
self
}
}
impl CallableCommand for GetRawMempoolCommand {
type Response = GetRawMempoolCommandResponse;
fn call(&self, client: &Client) -> Result<Self::Response, jsonrpc::Error> {
if self.verbose && self.mempool_sequence {
panic!("RPC command 'getrawmempool' has invalid arguments of verbose=true & mempool_sequence=true. Verbose results cannot contain mempool sequence values.");
}
let verbose_arg = self.verbose;
let mempool_sequence_arg = &self.mempool_sequence;
let verbose_arg_raw_value = to_raw_value(&verbose_arg).unwrap();
let mempool_sequence_arg_raw_value = to_raw_value(&mempool_sequence_arg).unwrap();
let command = "getrawmempool";
let params = vec![verbose_arg_raw_value, mempool_sequence_arg_raw_value];
let r = request(client, command, params);
let response: GetRawMempoolCommandResponse = r.result()?;
Ok(response)
}
}