xdi/types/
boxed_service.rs

1use std::any::Any;
2
3use super::type_info::{TypeInfo, TypeInfoSource};
4
5#[derive(Debug)]
6pub struct BoxedService {
7    ty: TypeInfo,
8    service: Box<dyn Any>,
9}
10
11impl BoxedService {
12    pub fn new<TService: 'static>(service: TService) -> Self {
13        Self {
14            service: Box::new(service),
15            ty: TService::type_info(),
16        }
17    }
18
19    pub fn unbox<TService: 'static>(self) -> Result<TService, Self> {
20        match self.service.downcast() {
21            Ok(service) => Ok(*service),
22            Err(service) => Err(BoxedService {
23                service,
24                ty: self.ty,
25            }),
26        }
27    }
28
29    pub fn ty(&self) -> TypeInfo {
30        self.ty
31    }
32}