use serde::{ Serialize, Deserialize, //de::DeserializeOwned, }; use std::{ borrow::Cow, }; use uuid::Uuid; use crate::{UID}; pub trait ToMsg: Clone { //+ Serialize + DeserializeOwned { fn as_message<'m>(&'m self) -> Message<'m, Self> where Cow<'m, Self>: From<&'m Self> { Message::new(self) } } // 1. Cow<'_, ItemWrap> - failed, Message::new needs val or ref // 2. ItemWrap> - can't impl From> for Cow #[derive(Serialize, Deserialize, Debug)] pub struct Message<'cow, I> where I: ToMsg { pub id: Uuid, pub item: Cow<'cow, I> } impl<'cow, I> Message<'cow, I> where I: ToMsg { pub fn new(item: C) -> Self where C: Into> { Self { id: UID.clone(), item: item.into() } } pub fn into_item(self) -> I { self.item.into_owned() } } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct RawMsg(pub String); impl ToMsg for Vec {} #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ItemWrap(pub T); impl ToMsg for ItemWrap {} impl<'cow, T: ToMsg> From> for Cow<'cow, ItemWrap> { fn from(obj: ItemWrap) -> Cow<'cow, ItemWrap> { Cow::Owned(obj) } } impl<'cow, T: ToMsg> From<&'cow ItemWrap> for Cow<'cow, ItemWrap> { fn from(obj: &'cow ItemWrap) -> Cow<'cow, ItemWrap> { Cow::Borrowed(obj) } } /* #[cfg(test)] mod tests { use super::*; #[test] fn test_create_message_owned() { let item = String::from("QWEDSA"); let msg_raw = Message { id: *UID, item: Cow::Owned(item.clone()) }; let msg = Message::new(item); assert_eq!(msg_raw.item, msg.item); } }*/