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        get_peers(
113            JsonRpcId::from(rand::thread_rng().gen::<u64>().to_string()),
114            &self.get_rpc_address(rpc_address),
115            self.get_verbosity(verbosity).into(),
116        )
117        .await
118    }
119}
120
121#[cfg(test)]
122mod tests {
123    use super::*;
124    use sdk_tests::tests::helpers::get_network_constants;
125
126    #[tokio::test]
127    async fn test_get_peers_with_none_values() {
128        // Arrange
129        let sdk = SDK::new(None, None, None);
130        let error_message = "failed to parse node address as valid URL";
131
132        // Act
133        let result = sdk.get_peers(None, None).await;
134
135        // Assert
136        assert!(result.is_err());
137        let err_string = result.err().unwrap().to_string();
138        assert!(err_string.contains(error_message));
139    }
140
141    #[tokio::test]
142    async fn test_get_peers_with_specific_arguments() {
143        // Arrange
144        let sdk = SDK::new(None, None, None);
145        let verbosity = Some(Verbosity::High);
146        let (rpc_address, _, _, _, _) = get_network_constants();
147
148        // Act
149        let result = sdk.get_peers(verbosity, Some(rpc_address)).await;
150
151        // Assert
152        assert!(result.is_ok());
153    }
154
155    #[tokio::test]
156    async fn test_get_peers_with_error() {
157        let sdk = SDK::new(Some("http://localhost".to_string()), None, None);
158
159        let error_message = "error sending request for url (http://localhost/rpc)";
160
161        // Act
162        let result = sdk.get_peers(None, None).await;
163
164        // Assert
165        assert!(result.is_err());
166        let err_string = result.err().unwrap().to_string();
167        assert!(err_string.contains(error_message));
168    }
169}