lit_sdk/
handshake.rs

1use crate::common::{Request, Response, UrlPrefix};
2use crate::{SdkError, SdkResult};
3use lit_node_core::{
4    NodeSet,
5    request::JsonSDKHandshakeRequest,
6    response::{GenericResponse, JsonSDKHandshakeResponse},
7};
8use std::{collections::HashMap, marker::PhantomData};
9use uuid::Uuid;
10
11/// The handshake request struct
12pub type HandshakeRequest = Request<
13    HandshakeRequestBuilder,
14    JsonSDKHandshakeRequest,
15    GenericResponse<JsonSDKHandshakeResponse>,
16>;
17
18/// The response type for handshake calls
19pub type HandshakeResponse = Response<GenericResponse<JsonSDKHandshakeResponse>>;
20
21basic_builder!(
22    HandshakeRequestBuilder,
23    JsonSDKHandshakeRequest,
24    GenericResponse<JsonSDKHandshakeResponse>,
25    "web/handshake"
26);
27
28impl HandshakeRequestBuilder {
29    builder_setter!(
30        client_public_key,
31        client_public_key,
32        String,
33        JsonSDKHandshakeRequest,
34        client_public_key
35    );
36    builder_setter!(
37        challenge,
38        challenge,
39        Option<String>,
40        JsonSDKHandshakeRequest,
41        challenge
42    );
43
44    /// Check that the inner request fields are set
45    fn request_checks(&self) -> SdkResult<()> {
46        if let Some(request) = &self.request {
47            if request.client_public_key.is_empty() {
48                return Err(SdkError::Build(
49                    "No client public key is specified".to_string(),
50                ));
51            }
52
53            if let Some(challenge) = &request.challenge
54                && challenge.is_empty()
55            {
56                return Err(SdkError::Build("No challenge is specified".to_string()));
57            }
58        }
59        Ok(())
60    }
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn set_request_fields() {
69        let request = HandshakeRequest::new()
70            .client_public_key("blah".to_string())
71            .challenge("challenge".to_string())
72            .node_set(vec![NodeSet {
73                socket_address: "".to_string(),
74                value: 0,
75            }])
76            .build()
77            .unwrap();
78        assert_eq!(request.inner.challenge, Some("challenge".to_string()));
79        assert_eq!(request.inner.client_public_key, "blah".to_string());
80    }
81
82    #[test]
83    fn set_request() {
84        let request = HandshakeRequest::new()
85            .request(JsonSDKHandshakeRequest {
86                challenge: None,
87                client_public_key: "blah".to_string(),
88            })
89            .node_set(vec![NodeSet {
90                socket_address: "".to_string(),
91                value: 0,
92            }])
93            .build()
94            .unwrap();
95        assert_eq!(request.inner.challenge, None);
96        assert_eq!(request.inner.client_public_key, "blah".to_string());
97    }
98}