wasm_client_solana 0.11.1

A wasm compatible solana rpc and pubsub client
Documentation
use serde::Deserialize;
use serde::Serialize;
use serde_with::DisplayFromStr;
use serde_with::serde_as;
use serde_with::skip_serializing_none;
use solana_pubkey::Pubkey;

use crate::impl_http_method;

#[derive(Debug, Serialize, Deserialize)]
pub struct GetClusterNodesRequest;

impl_http_method!(GetClusterNodesRequest, "getClusterNodes");

#[serde_as]
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct RpcContactInfoWasm {
	#[serde_as(as = "DisplayFromStr")]
	pub pubkey: Pubkey,
	pub gossip: Option<String>,
	pub tpu: Option<String>,
	pub rpc: Option<String>,
	pub version: Option<String>,
	pub feature_set: Option<u32>,
	pub shred_version: Option<u16>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct GetClusterNodesResponse(Vec<RpcContactInfoWasm>);

impl From<GetClusterNodesResponse> for Vec<RpcContactInfoWasm> {
	fn from(value: GetClusterNodesResponse) -> Self {
		value.0
	}
}

#[cfg(test)]
mod tests {
	use assert2::check;
	use solana_pubkey::pubkey;

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

	#[test]
	fn request() {
		let request = ClientRequest::builder()
			.method(GetClusterNodesRequest::NAME)
			.id(1)
			.params(GetClusterNodesRequest)
			.build();

		insta::assert_compact_json_snapshot!(request, @r###"{"jsonrpc": "2.0", "id": 1, "method": "getClusterNodes"}"###);
	}

	#[test]
	fn response() {
		let raw_json = r#"{"jsonrpc":"2.0","result":[{"gossip":"10.239.6.48:8001","pubkey":"9QzsJf7LPLj8GkXbYT3LFDKqsj2hHG7TA3xinJHu8epQ","rpc":"10.239.6.48:8899","tpu":"10.239.6.48:8856","version":"1.0.0 c375ce1f"}],"id":1}"#;

		let response: ClientResponse<GetClusterNodesResponse> =
			serde_json::from_str(raw_json).unwrap();

		check!(response.id == 1);
		check!(response.jsonrpc == "2.0");

		let value = &response.result.0[0];

		check!(value.gossip.as_ref().unwrap() == "10.239.6.48:8001");
		check!(value.pubkey == pubkey!("9QzsJf7LPLj8GkXbYT3LFDKqsj2hHG7TA3xinJHu8epQ"));
		check!(value.rpc.as_ref().unwrap() == "10.239.6.48:8899");
		check!(value.tpu.as_ref().unwrap() == "10.239.6.48:8856");
		check!(value.version.as_ref().unwrap() == "1.0.0 c375ce1f");
		check!(value.feature_set.is_none());
		check!(value.shred_version.is_none());
	}
}