wasm_client_solana 0.11.2

A wasm compatible solana rpc and pubsub client
Documentation
use serde::Deserialize;
use serde_tuple::Serialize_tuple;
use serde_with::skip_serializing_none;
use solana_clock::Slot;

use crate::impl_http_method;
use crate::rpc_config::RpcLeaderScheduleConfig;
use crate::rpc_response::RpcLeaderSchedule;

#[skip_serializing_none]
#[derive(Debug, Default, Serialize_tuple)]
pub struct GetLeaderScheduleRequest {
	#[serialize_always]
	pub slot: Option<Slot>,
	pub config: Option<RpcLeaderScheduleConfig>,
}

impl_http_method!(GetLeaderScheduleRequest, "getLeaderSchedule");

impl GetLeaderScheduleRequest {
	pub fn new() -> Self {
		Self::default()
	}

	pub fn new_with_slot_and_config(slot: Slot, config: RpcLeaderScheduleConfig) -> Self {
		Self {
			slot: Some(slot),
			config: Some(config),
		}
	}

	pub fn new_with_config(config: RpcLeaderScheduleConfig) -> Self {
		Self {
			slot: None,
			config: Some(config),
		}
	}
}

#[derive(Debug, Deserialize, PartialEq, Eq)]
pub struct GetLeaderScheduleResponse(Option<RpcLeaderSchedule>);

impl From<GetLeaderScheduleResponse> for Option<RpcLeaderSchedule> {
	fn from(value: GetLeaderScheduleResponse) -> Self {
		value.0
	}
}

#[cfg(test)]
mod tests {
	use std::collections::HashMap;

	use assert2::check;
	use solana_pubkey::Pubkey;
	use solana_pubkey::pubkey;

	use super::*;
	use crate::ClientRequest;
	use crate::ClientResponse;
	use crate::methods::HttpMethod;

	#[test]
	fn request() {
		let request = ClientRequest::builder()
			.method(GetLeaderScheduleRequest::NAME)
			.id(1)
			.params(GetLeaderScheduleRequest::new_with_config(
				RpcLeaderScheduleConfig {
					identity: Some(pubkey!("4Qkev8aNZcqFNSRhQzwyLMFSsi94jHqE8WNVTJzTP99F")),
					..Default::default()
				},
			))
			.build();

		insta::assert_compact_json_snapshot!(request, @r###"
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getLeaderSchedule",
    "params": [
      null,
      {
        "identity": "4Qkev8aNZcqFNSRhQzwyLMFSsi94jHqE8WNVTJzTP99F"
      }
    ]
  }
  "###);
	}

	#[test]
	fn response() {
		let raw_json = r#"{"jsonrpc":"2.0","result":{"4Qkev8aNZcqFNSRhQzwyLMFSsi94jHqE8WNVTJzTP99F":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]},"id":1}"#;
		let schedule: HashMap<Pubkey, Vec<usize>> = HashMap::from([(
			pubkey!("4Qkev8aNZcqFNSRhQzwyLMFSsi94jHqE8WNVTJzTP99F"),
			vec![
				0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
				23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
				44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
			],
		)]);
		let response: ClientResponse<GetLeaderScheduleResponse> =
			serde_json::from_str(raw_json).unwrap();
		let expected = ClientResponse {
			jsonrpc: String::from("2.0"),
			result: GetLeaderScheduleResponse(Some(RpcLeaderSchedule(schedule))),
			id: 1,
		};

		check!(response == expected);
	}
}