//! Originally from Intertrait by CodeChain //! //! //! //! //! Licensed under either of //! //! Apache License, Version 2.0 (LICENSE-APACHE or ) //! MIT license (LICENSE-MIT or ) //! //! at your option. use std::any::type_name; use error_stack::report; use crate::libs::intertrait::cast::error::CastError; use crate::libs::intertrait::{caster, CastFrom}; pub trait CastBox { /// Casts a box to this trait into that of type `OtherTrait`. fn cast( self: Box, ) -> error_stack::Result, CastError>; } /// A blanket implementation of `CastBox` for traits extending `CastFrom`. impl CastBox for CastFromSelf { fn cast( self: Box, ) -> error_stack::Result, CastError> { match caster::((*self).type_id()) { Some(caster) => Ok((caster.cast_box)(self.box_any())), None => Err(report!(CastError).attach_printable(format!( "From {} to {}", type_name::(), type_name::() ))), } } }