soph_core/traits/
instance.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
use crate::{
    error::ContainerError,
    support::{app, type_name, Container},
    Result,
};
use async_trait::async_trait;

#[async_trait]
pub trait InstanceTrait: std::any::Any + Send + Sync {
    type Config: serde::de::DeserializeOwned;

    fn name() -> String {
        type_name::<Self>()
    }

    async fn register(container: &Container) -> Result<Self, ContainerError>
    where
        Self: Sized;

    async fn boot() -> Result<(), ContainerError>
    where
        Self: Sized,
    {
        Ok(())
    }

    fn cleanup() -> Result<(), ContainerError> {
        Ok(())
    }

    fn facade() -> &'static Self
    where
        Self: Sized,
    {
        app()
            .resolve::<Self>()
            .unwrap_or_else(|err| panic!("{err}"))
    }
}