rsiot/components_config/websocket_server/
mod.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//! Конфигурация Websocket-сервера
//!
//! Тестирование:
//!
//! ```bash
//! cargo test -p rsiot-components-config --doc websocket_server
//! ```

use crate::message::*;

/// Конфигурация Websocket-сервера
#[derive(Clone, Debug)]
pub struct Config<TMsg> {
    /// Порт, через который доступен сервер
    pub port: u16,

    /// Функция преобразования входящих сообщений в текст для отправки клиенту
    ///
    /// # Примеры
    ///
    /// ## Заглушка
    ///
    /// ```rust
    /// # use rsiot_components_config::websocket_server::Config;
    /// # use rsiot_messages_core::{example_message::*, *};
    /// # Config::<Custom> {
    /// #    port: 8000,
    /// fn_input: |_| Ok(None),
    /// #    fn_output: |_| Ok(None)
    /// # };
    /// ```
    ///
    /// ## Сериализация в json
    ///
    /// ```
    /// # use rsiot_components_config::websocket_server::Config;
    /// # use rsiot_messages_core::{example_message::*, *};
    /// # Config::<Custom> {
    /// #    port: 8000,
    /// fn_input: |msg: &Message<Custom>| {
    ///     let text = msg.serialize()?;
    ///     Ok(Some(text))
    /// }
    /// # ,
    /// #    fn_output: |_| Ok(None)
    /// # };
    /// ```
    ///
    pub fn_input: fn(&Message<TMsg>) -> anyhow::Result<Option<String>>,

    /// Функция преобразования текста, полученного от клиента, в исходящий поток сообщений
    ///
    /// # Примеры
    ///
    /// ## Заглушка
    ///
    /// ```rust
    /// # use rsiot_components_config::websocket_server::Config;
    /// # use rsiot_messages_core::{example_message::*, *};
    /// # Config::<Custom> {
    /// #    port: 8000,
    /// #    fn_input: |_| Ok(None),
    /// fn_output: |_| Ok(None)
    /// # };
    /// ```
    ///
    /// ## Десериализация из json:
    /// ```rust
    /// # use rsiot_components_config::websocket_server::Config;
    /// # use rsiot_messages_core::{example_message::*, *};
    /// # Config::<Custom> {
    /// #    port: 8000,
    /// #    fn_input: |_| Ok(None),
    /// fn_output: |text: &str| {
    ///     let msg = Message::<Custom>::deserialize(text)?;
    ///     Ok::<Option<Vec<Message<Custom>>>, anyhow::Error>(Some(vec![msg]))
    /// }
    /// # };
    /// ```
    ///
    pub fn_output: FnOutput<TMsg>,
}

pub type FnOutput<TMsg> = fn(&str) -> anyhow::Result<Option<Vec<Message<TMsg>>>>;