1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
use core::any::{self, Any};
use core::fmt;
// use erased_serde::{Deserializer, Serialize};

pub trait Message: Any + fmt::Debug/*Serialize + for<'a> Deserializer<'a> + */ + Unpin + Clone + Send + Sync + 'static {}
impl<T: Any + fmt::Debug + Unpin + Clone + Send + Sync> Message for T {}

trait SafeMessage: Any + fmt::Debug/*+ Serialize + for<'a> Deserializer<'a>*/ + Unpin + Send + Sync + 'static {
    fn type_name(&self) -> &'static str;
    fn clone_boxed(&self) -> Box<dyn SafeMessage>;
}

impl<T: Message> SafeMessage for T {
    fn type_name(&self) -> &'static str {
        any::type_name::<T>()
    }

    fn clone_boxed(&self) -> Box<dyn SafeMessage> {
        Box::new(self.clone())
    }
}

// pub struct BoxedEnvelop {
//     inner: Box<dyn SafeMessage>,
// }

// impl BoxedEnvelop {
//     pub fn from_message<M: Message>(m: M) -> Self {
//         Self {
//             inner: Box::new(m)
//         }
//     }

//     pub fn as_ref(&self) -> Envelop<'_> {
//         Envelop { inner: &*self.inner }
//     }

//     pub fn downcast<T: 'static>(self) -> Option<Box<T>> {
//         if (*self.inner).type_id() == TypeId::of::<T>() {
//             unsafe {
//                 let raw: *mut dyn SafeMessage = Box::into_raw(self.inner);

//                 Some(Box::from_raw(raw as *mut T))
//             }
//         } else {
//             None
//         }
//     }
// }

#[derive(Copy, Clone)]
pub struct Envelop<'inner> {
    inner: &'inner dyn SafeMessage,
}

impl<'inner> fmt::Debug for Envelop<'inner> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "Envelop(")?;
        self.inner.fmt(f)?;
        write!(f, ")")?;

        Ok(())
    }
}

impl<'inner> Envelop<'inner> {
    // pub fn new<T: Message>(inner: &'inner T) -> Self {
    //     Self { inner }
    // }

    // #[inline]
    // pub fn downcast_to<T: 'static>(&self) -> Option<&T> {
    //     if self.inner.type_id() == TypeId::of::<T>() {
    //         unsafe { Some(&*(self.inner as *const dyn SafeMessage as *const T)) }
    //     } else {
    //         None
    //     }
    // }

    // #[inline]
    // pub fn type_id(&self) -> TypeId {
    //     self.inner.type_id()
    // }

    // #[inline]
    // pub fn type_name(&self) -> &'static str {
    //     self.inner.type_name()
    // }

    // #[inline]
    // pub fn clone_boxed(&self) -> BoxedEnvelop {
    //     BoxedEnvelop {
    //         inner: self.inner.clone_boxed(),
    //     }
    // }
}

// impl<'inner> serde::Serialize for Envelop<'inner> {
//     fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
//         erased_serde::serialize(self.inner, serializer)
//     }
// }