rsiot/components_config/websocket_client/
config.rs

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