use std::time::Duration;
use tokio::sync::{ mpsc as msc, oneshot as osh, };
use crate::{
shared::id_tools::{ TaskId, AcknowledgeId, },
ChannelIdType, traits::FullId,
structs::archmod::archannel::{
SerializedDataQuerySender as BinQySender, SerializedDataQueryReceiver as BinQyReceiver,
RootSerializedDataBroadcastSender as BinBcSender, RootSerializedDataBroadcastReceiver as BinBcReceiver,
SerializedDataSignalSender as BinSgSender, SerializedDataSignalReceiver as BinSgReceiver,
},
};
pub enum MsgFromMaster {
Ctrl (TaskId,CtrlCell),
}
pub enum ReplyToServant {
Aknowledged(AcknowledgeId,),
}
pub enum MsgFromServant {
FailureChl(TaskId,ChannelIdType),
StaledChl(TaskId,ChannelIdType),
Shutdown(TaskId,),
}
pub enum ReplyToMaster {
Ok(AcknowledgeId,),
Undefined(AcknowledgeId,),
PingFail(AcknowledgeId,),
Failure(AcknowledgeId,),
WrongType(AcknowledgeId,),
OutOfTime(AcknowledgeId,),
}
pub enum CtrlCell {
SetChl(ChannelIdType, SetChannel),
TurnOnChl(ChannelIdType),
TurnOffChl(ChannelIdType),
PingChl(ChannelIdType),
KillChl(ChannelIdType),
Kill,
}
#[derive(Clone)]
pub enum SetChannel {
NetQuerySender { max_ping: Duration,
query_type: FullId, reply_type: FullId, sender: BinQySender,
},
NetQueryReceiver { max_ping: Duration,
query_type: FullId, reply_type: FullId, receiver: BinQyReceiver,
},
NetBroadcastSender { max_ping: Duration,
data_type: FullId, sender: BinBcSender,
},
NetBroadcastReceiver { max_ping: Duration,
data_type: FullId, receiver: BinBcReceiver,
},
QuerySender { max_ping: Duration,
query_type: FullId, reply_type: FullId, sender: BinQySender,
},
QueryReceiver { max_ping: Duration,
query_type: FullId, reply_type: FullId, receiver: BinQyReceiver,
},
BroadcastSender { max_ping: Duration,
data_type: FullId, sender: BinBcSender,
},
BroadcastReceiver { max_ping: Duration,
data_type: FullId, receiver: BinBcReceiver,
},
SignalSender {
max_ping: Duration,
data_type: FullId, sender: BinSgSender,
},
SignalReceiver {
max_ping: Duration,
data_type: FullId, receiver: BinSgReceiver,
},
}
pub type SenderToMaster = osh::Sender<ReplyToMaster>;
pub type SendToMaster = msc::Sender<(MsgFromServant,osh::Sender<ReplyToServant>)>;
pub type RecvFromServant = msc::Receiver<(MsgFromServant,osh::Sender<ReplyToServant>)>;
pub type SendToServant = msc::Sender<(MsgFromMaster,SenderToMaster)>;
pub type RecvFromMaster = msc::Receiver<(MsgFromMaster,SenderToMaster)>;
impl MsgFromServant {
pub async fn send(self, sender: &SendToMaster,) -> Result<osh::Receiver<ReplyToServant>,String> {
let (osender,oreceiver,) = osh::channel();
match sender.send((self,osender)).await {
Ok(()) => Ok(oreceiver), Err(_) => Err(format!("MsgFromServant: failed to send message")),
}
}
}
impl MsgFromMaster {
pub async fn send(self, sender: &SendToServant,) -> Result<osh::Receiver<ReplyToMaster>,String> {
let (osender,oreceiver,) = osh::channel();
match sender.send((self,osender)).await {
Ok(()) => Ok(oreceiver), Err(_) => Err(format!("MsgFromMaster: failed to send message")),
}
}
}