dyn-dyn 0.2.0

Flexible trait object downcasting using ptr_metadata
Documentation
use dyn_dyn::{dyn_dyn_base, dyn_dyn_cast, dyn_dyn_impl, DynDynBase, DynDynTable};

#[dyn_dyn_base]
trait Base {}
trait Trait {
    fn test(&self) -> u32;
}

struct StructA;

#[dyn_dyn_impl]
impl Base for StructA {}

struct StructB(u32);

#[dyn_dyn_impl(Trait)]
impl Base for StructB {}
impl Trait for StructB {
    fn test(&self) -> u32 {
        self.0
    }
}

#[allow(dead_code)]
struct DstStruct<T: ?Sized>(u32, T);

unsafe impl<B: ?Sized + DynDynBase> DynDynBase for DstStruct<B> {
    fn get_dyn_dyn_table(&self) -> DynDynTable {
        B::get_dyn_dyn_table(&self.1)
    }
}

#[test]
fn test_dst_struct_cast() {
    assert_eq!(
        Err(()),
        dyn_dyn_cast!(Base => Trait [DstStruct<$>], &DstStruct(0, StructA) as &DstStruct<dyn Base>)
            .map(|t| t.1.test())
            .map_err(|_| ())
    );
    assert_eq!(
        Ok(1234),
        dyn_dyn_cast!(Base => Trait [DstStruct<$>], &DstStruct(0, StructB(1234)) as &DstStruct<dyn Base>)
            .map(|t| t.1.test())
            .map_err(|_| ())
    );
}