extern-trait 0.4.3

Opaque types for traits using static dispatch
Documentation
use extern_trait::extern_trait;

#[extern_trait(CopyProxy)]
trait CopyApi: Clone + Copy {
    fn new(v: u8) -> Self;
    fn value(&self) -> u8;
}

mod copy_impl {
    use super::*;

    #[derive(Clone, Copy)]
    struct CopyImpl(u8);

    #[extern_trait]
    impl CopyApi for CopyImpl {
        fn new(v: u8) -> Self {
            Self(v)
        }

        fn value(&self) -> u8 {
            self.0
        }
    }
}

#[test]
fn copy_proxy_is_copy() {
    fn assert_copy<T: Copy>() {}
    assert_copy::<CopyProxy>();

    assert!(!std::mem::needs_drop::<CopyProxy>());

    let a = CopyProxy::new(42);
    let b = a;
    assert_eq!(a.value(), 42);
    assert_eq!(b.value(), 42);
}