rsiot/components/cmp_filesystem/
config.rs

1use std::fmt::Debug;
2
3use serde::{de::DeserializeOwned, Serialize};
4
5use crate::{message::MsgDataBound, serde_utils::SerdeAlgKind};
6
7/// Функция преобразования сообщений в текстовые файлы.
8///
9/// Возращает кортеж из двух значений:
10/// - название файла для сохранения
11/// - содержимое файла
12pub type FnInput<TMsg, TBuffer> = fn(&TMsg, &TBuffer) -> Option<TBuffer>;
13
14/// Функция преобразования текстовых файлов в сообщения
15pub type FnOutput<TMsg, TBuffer> = fn(&TBuffer) -> Vec<TMsg>;
16
17/// Конфигурация cmp_filesystem
18#[derive(Clone)]
19pub struct Config<TMsg, TBuffer>
20where
21    TMsg: MsgDataBound,
22    TBuffer: BufferBound,
23{
24    /// Алгоритм сериализации/десериализации
25    pub serde_alg: SerdeAlgKind,
26
27    /// Папка, в которой хранятся файлы
28    pub filename: String,
29
30    /// Частота вызова функции создания исходящих сообщений
31    pub call_fn_output_kind: CallFnOutputKind,
32
33    /// Функция преобразования сообщений в текстовые файлы
34    pub fn_input: FnInput<TMsg, TBuffer>,
35
36    /// Функция преобразования текстовых файлов в сообщения
37    pub fn_output: FnOutput<TMsg, TBuffer>,
38}
39
40/// Частота вызова функции создания исходящих сообщений
41#[derive(Clone, Debug)]
42pub enum CallFnOutputKind {
43    /// Один раз при запуске
44    OnStartup,
45    /// Каждый раз при изменении буфера
46    Always,
47}
48
49/// Ограничения на структуру буфера
50///
51/// На структуре необходимо релизовать:
52///
53/// ```no_run
54/// #[derive(Clone, Debug, Default, Deserialize, Serialize)]
55/// ```
56pub trait BufferBound:
57    Clone + Debug + Default + DeserializeOwned + Send + Serialize + Sync
58{
59}