Skip to main content

casper_rust_wasm_sdk/sdk/rpcs/
get_peers.rs

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