//! 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 std::rc::Rc; use crate::libs::intertrait::cast::error::CastError; use crate::libs::intertrait::{get_caster, CastFrom}; pub trait CastRc { /// Casts an `Rc` for this trait into that for type `OtherTrait`. fn cast( self: Rc, ) -> Result, CastError>; } /// A blanket implementation of `CastRc` for traits extending `CastFrom`. impl CastRc for CastFromSelf { fn cast( self: Rc, ) -> Result, CastError> { let caster = get_caster::((*self).type_id()) .map_err(CastError::GetCasterFailed)?; (caster.cast_rc)(self.rc_any()).map_err(|err| CastError::CastFailed { source: err, from: type_name::(), to: type_name::(), }) } }