use mio_extras::channel::{SyncSender, TrySendError};
use std::io;
use super::InternalEnvelope;
#[derive(Clone)]
pub struct Outgoing {
id: usize,
tx: SyncSender<InternalEnvelope>,
}
impl Outgoing {
pub(super) fn new(id: usize, tx: SyncSender<InternalEnvelope>) -> Self {
Outgoing { id, tx }
}
pub fn send(&self, payload: Vec<u8>) -> Result<(), SendError> {
self.tx.try_send(InternalEnvelope::Message {
id: self.id,
payload,
})?;
Ok(())
}
pub fn id(&self) -> usize {
self.id
}
}
#[derive(Debug)]
pub enum SendError {
IoError(io::Error),
Full(Vec<u8>),
Disconnected(Vec<u8>),
}
impl From<TrySendError<InternalEnvelope>> for SendError {
fn from(err: TrySendError<InternalEnvelope>) -> Self {
match err {
TrySendError::Full(envelope) => {
match envelope {
InternalEnvelope::Message { payload, .. } => SendError::Full(payload),
InternalEnvelope::Shutdown => unreachable!(),
}
}
TrySendError::Disconnected(envelope) => {
match envelope {
InternalEnvelope::Message { payload, .. } => SendError::Disconnected(payload),
InternalEnvelope::Shutdown => unreachable!(),
}
}
TrySendError::Io(err) => SendError::IoError(err),
}
}
}