/** * 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::rc::Rc; use crate::libs::intertrait::{caster, CastFrom}; pub trait CastRc { /// Casts an `Rc` for this trait into that for `Trait`. fn cast(self: Rc) -> Result, Rc>; } /// A blanket implementation of `CastRc` for traits extending `CastFrom`. impl CastRc for CastableFrom { fn cast(self: Rc) -> Result, Rc> { match caster::((*self).type_id()) { Some(caster) => Ok((caster.cast_rc)(self.rc_any())), None => Err(self), } } }