1use thiserror::Error;
5
6pub mod configuration;
7pub mod id;
8
9#[derive(Error, Debug)]
11pub enum ComponentError {
12 #[error("configuration error {0}")]
13 ConfigError(String),
14 #[error("runtime error: {0}")]
15 RuntimeError(String),
16 #[error("unknown error")]
17 Unknown,
18}
19
20pub trait Component {
21 fn identifier(&self) -> &id::ID;
23
24 #[allow(async_fn_in_trait)]
26 async fn start(&mut self) -> Result<(), ComponentError>;
27}
28
29pub trait ComponentBuilder {
30 type Config;
32 type Component: Component;
33
34 fn kind(&self) -> id::Kind;
36
37 fn build(&self, name: String) -> Result<Self::Component, ComponentError>;
39
40 fn build_with_config(
42 &self,
43 name: &str,
44 config: &Self::Config,
45 ) -> Result<Self::Component, ComponentError>;
46}