use crate::{error::Error, relay::RelayMessage};
use ockam_core::{Address, AddressSet};
use tokio::sync::mpsc::{channel, Receiver, Sender};
#[derive(Debug)]
pub enum NodeMessage {
StartWorker(AddressSet, Sender<RelayMessage>),
ListWorkers(Sender<NodeReplyResult>),
StopWorker(Address, Sender<NodeReplyResult>),
StopNode,
SenderReq(Address, Sender<NodeReplyResult>),
Router(u8, Address, Sender<NodeReplyResult>),
}
impl NodeMessage {
pub fn start_worker(address: AddressSet, sender: Sender<RelayMessage>) -> Self {
Self::StartWorker(address, sender)
}
pub fn list_workers() -> (Self, Receiver<NodeReplyResult>) {
let (tx, rx) = channel(1);
(Self::ListWorkers(tx), rx)
}
pub fn stop_worker(address: Address) -> (Self, Receiver<NodeReplyResult>) {
let (tx, rx) = channel(1);
(Self::StopWorker(address, tx), rx)
}
pub fn stop_node() -> Self {
Self::StopNode
}
pub fn sender_request(route: Address) -> (Self, Receiver<NodeReplyResult>) {
let (tx, rx) = channel(1);
(Self::SenderReq(route, tx), rx)
}
}
pub type NodeReplyResult = Result<NodeReply, NodeError>;
#[derive(Debug)]
pub enum NodeReply {
Ok,
Workers(Vec<Address>),
Sender {
addr: Address,
sender: Sender<RelayMessage>,
wrap: bool,
},
}
#[derive(Debug)]
pub enum NodeError {
NoSuchWorker(Address),
RouterExists,
}
impl NodeReply {
pub fn ok() -> NodeReplyResult {
Ok(NodeReply::Ok)
}
pub fn no_such_worker(a: Address) -> NodeReplyResult {
Err(NodeError::NoSuchWorker(a))
}
pub fn router_exists() -> NodeReplyResult {
Err(NodeError::RouterExists)
}
pub fn workers(v: Vec<Address>) -> NodeReplyResult {
Ok(Self::Workers(v))
}
pub fn sender(addr: Address, sender: Sender<RelayMessage>, wrap: bool) -> NodeReplyResult {
Ok(NodeReply::Sender { addr, sender, wrap })
}
pub fn take_sender(self) -> Result<(Address, Sender<RelayMessage>, bool), Error> {
match self {
Self::Sender { addr, sender, wrap } => Ok((addr, sender, wrap)),
_ => Err(Error::InternalIOFailure.into()),
}
}
pub fn take_workers(self) -> Result<Vec<Address>, Error> {
match self {
Self::Workers(w) => Ok(w),
_ => Err(Error::InternalIOFailure.into()),
}
}
pub fn is_ok(self) -> Result<(), Error> {
match self {
Self::Ok => Ok(()),
_ => Err(Error::InternalIOFailure.into()),
}
}
}