xdi/types/
boxed_service.rs1use 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}