Skip to main content

rsiot/components_config/websocket_client/
config.rs

1//! Конфигурация websocket-клиента
2
3use crate::{components_config::websocket_general::WebsocketMessage, serde_utils::SerdeAlgKind};
4
5/// Преобразование входящих сообщений в текст для отправки на сервер
6pub type FnClientToServer<TMsg, TClientToServer> = fn(&TMsg) -> Option<TClientToServer>;
7
8/// Преобразование полученного от сервера текста в исходящие сообщения
9pub type FnServerToClient<TMsg, TServerToClient> = fn(TServerToClient) -> Vec<TMsg>;
10
11// ANCHOR: Config
12/// Настройки Websocket-клиента
13#[derive(Clone, Debug)]
14pub struct Config<TMsg, TServerToClient, TClientToServer>
15where
16    TServerToClient: WebsocketMessage,
17    TClientToServer: WebsocketMessage,
18{
19    /// Алгоритм сериализации / десериализации
20    pub serde_alg: SerdeAlgKind,
21
22    /// Адрес Websocket-сервера
23    ///
24    /// # Примеры
25    ///
26    /// "ws://localhost:8000"
27    ///
28    /// # На платформе WASM
29    ///
30    /// ```
31    /// let hostname = cmp_leptos::utils::define_hostname().unwrap();
32    /// let url = format!("ws://{hostname}:8000"),
33    /// ```
34    pub url: String,
35
36    /// Преобразование входящих сообщений в текст для отправки на сервер
37    pub fn_client_to_server: FnClientToServer<TMsg, TClientToServer>,
38
39    /// Преобразование полученного от сервера текста в исходящие сообщения
40    pub fn_server_to_client: FnServerToClient<TMsg, TServerToClient>,
41
42    /// Функция создает исходящее сообщение с информацией о соединении
43    ///
44    /// В функцию передается состояние соединения;
45    /// - true - соединение установлено
46    /// - false - соединение разорвано
47    ///
48    /// Примеры см. в тестах
49    pub fn_connection_state: fn(bool) -> Option<TMsg>,
50}
51// ANCHOR: Config
52
53impl<TMsg, TServerToClient, TClientToServer> Default
54    for Config<TMsg, TServerToClient, TClientToServer>
55where
56    TServerToClient: WebsocketMessage,
57    TClientToServer: WebsocketMessage,
58{
59    fn default() -> Self {
60        Self {
61            serde_alg: SerdeAlgKind::Unspecified,
62            url: "ws://localhost:8000".into(),
63            fn_client_to_server: |_| None,
64            fn_server_to_client: |_| vec![],
65            fn_connection_state: |_| None,
66        }
67    }
68}
69
70#[cfg(test)]
71#[allow(unused_variables, clippy::field_reassign_with_default)]
72mod tests {
73    use serde::{Deserialize, Serialize};
74    use strum::IntoStaticStr;
75
76    use super::*;
77    use crate::message::example_message::*;
78
79    #[test]
80    fn fn_connection_state() {
81        // Заглушка
82        let fn_connection_state_1 = |_| None;
83
84        #[derive(Clone, Debug, Deserialize, IntoStaticStr, Serialize)]
85        enum ServerToClient {}
86        impl WebsocketMessage for ServerToClient {}
87
88        #[derive(Clone, Debug, Deserialize, IntoStaticStr, Serialize)]
89        enum ClientToServer {}
90        impl WebsocketMessage for ClientToServer {}
91
92        let mut config_1: Config<Custom, ServerToClient, ClientToServer> = Default::default();
93        config_1.fn_connection_state = fn_connection_state_1;
94    }
95}