1use std::future::Future;
2
3use mm1_address::address::Address;
4use mm1_common::errors::error_of::ErrorOf;
5use mm1_common::impl_error_kind;
6use mm1_proto::Message;
7
8use crate::context::Call;
9use crate::message::AnyMessage;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
12pub enum TellErrorKind {
13 InternalError,
14 NotFound,
15 Closed,
16 Full,
17}
18
19pub trait Tell: Call<Address, AnyMessage, Outcome = Result<(), ErrorOf<TellErrorKind>>> {
20 fn tell<M>(
21 &mut self,
22 to: Address,
23 msg: M,
24 ) -> impl Future<Output = Result<(), ErrorOf<TellErrorKind>>> + Send
25 where
26 M: Message,
27 {
28 async move {
29 let message = AnyMessage::new(msg);
30 self.call(to, message).await
31 }
32 }
33}
34
35impl<T> Tell for T where T: Call<Address, AnyMessage, Outcome = Result<(), ErrorOf<TellErrorKind>>> {}
36
37impl_error_kind!(TellErrorKind);