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}