rsiot/components/cmp_filesystem/config.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
use std::fmt::Debug;
use serde::{de::DeserializeOwned, Serialize};
use crate::{message::MsgDataBound, serde_utils::SerdeAlgKind};
/// Функция преобразования сообщений в текстовые файлы.
///
/// Возращает кортеж из двух значений:
/// - название файла для сохранения
/// - содержимое файла
pub type FnInput<TMsg, TBuffer> = fn(&TMsg, &TBuffer) -> Option<TBuffer>;
/// Функция преобразования текстовых файлов в сообщения
pub type FnOutput<TMsg, TBuffer> = fn(&TBuffer) -> Vec<TMsg>;
/// Конфигурация cmp_filesystem
#[derive(Clone)]
pub struct Config<TMsg, TBuffer>
where
TMsg: MsgDataBound,
TBuffer: BufferBound,
{
/// Алгоритм сериализации/десериализации
pub serde_alg: SerdeAlgKind,
/// Папка, в которой хранятся файлы
pub filename: String,
/// Частота вызова функции создания исходящих сообщений
pub call_fn_output_kind: CallFnOutputKind,
/// Функция преобразования сообщений в текстовые файлы
pub fn_input: FnInput<TMsg, TBuffer>,
/// Функция преобразования текстовых файлов в сообщения
pub fn_output: FnOutput<TMsg, TBuffer>,
}
/// Частота вызова функции создания исходящих сообщений
#[derive(Clone, Debug)]
pub enum CallFnOutputKind {
/// Один раз при запуске
OnStartup,
/// Каждый раз при изменении буфера
Always,
}
/// Ограничения на структуру буфера
///
/// На структуре необходимо релизовать:
///
/// ```no_run
/// #[derive(Clone, Debug, Default, Deserialize, Serialize)]
/// ```
pub trait BufferBound:
Clone + Debug + Default + DeserializeOwned + Send + Serialize + Sync
{
}