//! 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::sync::Arc; use crate::libs::intertrait::cast::error::CastError; use crate::libs::intertrait::{get_caster, CastFromSync}; pub trait CastArc { /// Casts an `Arc` for this trait into that for type `OtherTrait`. fn cast( self: Arc, ) -> Result, CastError>; } /// A blanket implementation of `CastArc` for traits extending `CastFrom`, `Sync`, and /// `Send`. impl CastArc for CastFromSelf { fn cast( self: Arc, ) -> Result, CastError> { let caster = get_caster::((*self).type_id()).map_or_else( || { Err(CastError::CastFailed { from: type_name::(), to: type_name::(), }) }, Ok, )?; match caster.opt_cast_arc { Some(cast_arc) => Ok(cast_arc(self.arc_any())), None => Err(CastError::NotArcCastable(type_name::())), } } }