#![feature(type_alias_impl_trait)] use std::{alloc::Layout, any::Any, sync::Arc}; use futures::Future; use messagebus::{ bus::Bus, cell::MsgCell, error::Error, handler::Handler, message::{Message, SharedMessage}, receiver::IntoAbstractReceiver, receivers::wrapper::HandlerWrapper, type_tag::{TypeTag, TypeTagInfo}, }; #[derive(Debug, Clone)] struct Msg(pub u32); impl Message for Msg { fn TYPE_TAG() -> TypeTag where Self: Sized, { TypeTagInfo::parse("demo::Msg").unwrap().into() } fn type_tag(&self) -> TypeTag { Msg::TYPE_TAG() } fn type_layout(&self) -> Layout { Layout::for_value(self) } fn as_any_ref(&self) -> &dyn Any { self } fn as_any_mut(&mut self) -> &mut dyn Any { self } fn as_any_boxed(self: Box) -> Box { self as _ } fn as_any_arc(self: Arc) -> Arc { self as _ } fn as_shared_ref(&self) -> Option<&dyn SharedMessage> { None } fn as_shared_mut(&mut self) -> Option<&mut dyn SharedMessage> { None } fn as_shared_boxed(self: Box) -> Result, Box> { Err(self) } fn as_shared_arc(self: Arc) -> Option> { None } fn try_clone_into(&self, into: &mut dyn Message) -> bool { false } fn try_clone_boxed(&self) -> Option> { None } fn try_clone(&self) -> Option where Self: Sized, { Some(Self(self.0)) } } struct Test { inner: u32, } impl Handler for Test { type Response = Msg; type HandleFuture<'a> = impl Future> + 'a; type FlushFuture<'a> = std::future::Ready>; fn handle(&self, msg: &mut MsgCell, _: &Bus) -> Self::HandleFuture<'_> { let msg = msg.take().unwrap(); async move { println!("msg {msg:?}"); let x = self.inner; Ok(Msg(x + msg.0)) } } fn flush(&mut self, _: &Bus) -> Self::FlushFuture<'_> { std::future::ready(Ok(())) } } async fn run() -> Result<(), Error> { let bus = Bus::new(); let wrapper = HandlerWrapper::new(Arc::new(Test { inner: 12 })); let receiver = wrapper.into_abstract_arc(); let handler = receiver.send_msg(Msg(12), bus.clone()).await?; println!("sent"); let res: Msg = receiver.result(handler).await?; println!("send result got {:?}", res); let res: Msg = receiver.request(Msg(13), bus.clone()).await?; println!("request result got {:?}", res); Ok(()) } #[tokio::main] async fn main() { run().await.unwrap(); }