casper_rust_wasm_sdk/sdk/rpcs/
get_peers.rs

1use crate::{types::verbosity::Verbosity, SDK};
2use casper_client::{
3    get_peers, rpcs::results::GetPeersResult as _GetPeersResult, Error, JsonRpcId, SuccessResponse,
4};
5#[cfg(target_arch = "wasm32")]
6use gloo_utils::format::JsValueSerdeExt;
7use rand::Rng;
8#[cfg(target_arch = "wasm32")]
9use serde::{Deserialize, Serialize};
10#[cfg(target_arch = "wasm32")]
11use wasm_bindgen::prelude::*;
12
13/// A wrapper for the `GetPeersResult` type from the Casper client.
14#[cfg(target_arch = "wasm32")]
15#[derive(Debug, Deserialize, Clone, Serialize)]
16#[wasm_bindgen]
17pub struct GetPeersResult(_GetPeersResult);
18
19#[cfg(target_arch = "wasm32")]
20impl From<GetPeersResult> for _GetPeersResult {
21    fn from(result: GetPeersResult) -> Self {
22        result.0
23    }
24}
25
26#[cfg(target_arch = "wasm32")]
27impl From<_GetPeersResult> for GetPeersResult {
28    fn from(result: _GetPeersResult) -> Self {
29        GetPeersResult(result)
30    }
31}
32
33#[cfg(target_arch = "wasm32")]
34#[wasm_bindgen]
35impl GetPeersResult {
36    /// Gets the API version as a JSON value.
37    #[wasm_bindgen(getter)]
38    pub fn api_version(&self) -> JsValue {
39        JsValue::from_serde(&self.0.api_version).unwrap()
40    }
41
42    /// Gets the peers as a JSON value.
43    #[wasm_bindgen(getter)]
44    pub fn peers(&self) -> JsValue {
45        JsValue::from_serde(&self.0.peers).unwrap()
46    }
47
48    /// Converts the result to JSON format as a JavaScript value.
49    #[wasm_bindgen(js_name = "toJson")]
50    pub fn to_json(&self) -> JsValue {
51        JsValue::from_serde(&self.0).unwrap_or(JsValue::null())
52    }
53}
54
55#[cfg(target_arch = "wasm32")]
56#[wasm_bindgen]
57impl SDK {
58    /// Retrieves peers asynchronously.
59    ///
60    /// # Arguments
61    ///
62    /// * `verbosity` - Optional verbosity level.
63    /// * `rpc_address` - Optional rpc address.
64    ///
65    /// # Returns
66    ///
67    /// A `Result` containing `GetPeersResult` or a `JsError` if an error occurs.
68    #[wasm_bindgen(js_name = "get_peers")]
69    pub async fn get_peers_js_alias(
70        &self,
71        verbosity: Option<Verbosity>,
72        rpc_address: Option<String>,
73    ) -> Result<GetPeersResult, JsError> {
74        let result = self.get_peers(verbosity, rpc_address).await;
75        match result {
76            Ok(data) => Ok(data.result.into()),
77            Err(err) => {
78                let err = &format!("Error occurred with {err:?}");
79                Err(JsError::new(err))
80            }
81        }
82    }
83
84    // JavaScript alias for `get_peers`
85    #[deprecated(note = "This function is an alias. Please use `get_peers` instead.")]
86    #[allow(deprecated)]
87    pub async fn info_get_peers(
88        &self,
89        verbosity: Option<Verbosity>,
90        rpc_address: Option<String>,
91    ) -> Result<GetPeersResult, JsError> {
92        self.get_peers_js_alias(verbosity, rpc_address).await
93    }
94}
95
96impl SDK {
97    /// Retrieves peers.
98    ///
99    /// # Arguments
100    ///
101    /// * `verbosity` - Optional verbosity level.
102    /// * `rpc_address` - Optional rpc address.
103    ///
104    /// # Returns
105    ///
106    /// A `Result` containing `SuccessResponse` with `_GetPeersResult` or an `Error` if an error occurs.
107    pub async fn get_peers(
108        &self,
109        verbosity: Option<Verbosity>,
110        rpc_address: Option<String>,
111    ) -> Result<SuccessResponse<_GetPeersResult>, Error> {
112        let random_id = JsonRpcId::from(rand::thread_rng().gen::<u64>().to_string());
113        get_peers(
114            random_id,
115            &self.get_rpc_address(rpc_address),
116            self.get_verbosity(verbosity).into(),
117        )
118        .await
119    }
120}
121
122#[cfg(test)]
123mod tests {
124    use super::*;
125    use sdk_tests::tests::helpers::get_network_constants;
126
127    #[tokio::test]
128    async fn test_get_peers_with_none_values() {
129        // Arrange
130        let sdk = SDK::new(None, None, None);
131        let error_message = "failed to parse node address as valid URL";
132
133        // Act
134        let result = sdk.get_peers(None, None).await;
135
136        // Assert
137        assert!(result.is_err());
138        let err_string = result.err().unwrap().to_string();
139        assert!(err_string.contains(error_message));
140    }
141
142    #[tokio::test]
143    async fn test_get_peers_with_specific_arguments() {
144        // Arrange
145        let sdk = SDK::new(None, None, None);
146        let verbosity = Some(Verbosity::High);
147        let (rpc_address, _, _, _, _) = get_network_constants();
148
149        // Act
150        let result = sdk.get_peers(verbosity, Some(rpc_address)).await;
151
152        // Assert
153        assert!(result.is_ok());
154    }
155
156    #[tokio::test]
157    async fn test_get_peers_with_error() {
158        let sdk = SDK::new(Some("http://localhost".to_string()), None, None);
159
160        let error_message = "error sending request";
161
162        // Act
163        let result = sdk.get_peers(None, None).await;
164
165        // Assert
166        assert!(result.is_err());
167        let err_string = result.err().unwrap().to_string();
168        assert!(err_string.contains(error_message));
169    }
170}