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
use tokio::task::JoinHandle;

use crate::{
    cache::Cache,
    error::ComponentError,
    types::{ComponentInput, ComponentOutput},
};

/// Трейт для работы с компонентом из построителя цепочки компонентов
/// ComponentChainBuilder
pub trait IComponent<TMessage> {
    /// Задать входной поток
    fn set_input(&mut self, input: ComponentInput<TMessage>);

    /// Задать выходной поток
    fn set_output(&mut self, output: ComponentOutput<TMessage>);

    // Задать ссылку на кеш
    fn set_cache(&mut self, cache: Cache<TMessage>);

    /// Порождаем асинхронную задачу
    fn spawn(&mut self) -> Result<JoinHandle<Result<(), ComponentError>>, ComponentError>;

    /// Задать входной и выходной потоки и запустить на выполнение
    fn set_and_spawn(
        &mut self,
        input: ComponentInput<TMessage>,
        output: ComponentOutput<TMessage>,
    ) -> Result<JoinHandle<Result<(), ComponentError>>, ComponentError> {
        self.set_input(input);
        self.set_output(output);
        self.spawn()
    }
}