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::new(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) => SendError::Full(envelope.payload),
TrySendError::Disconnected(envelope) => SendError::Disconnected(envelope.payload),
TrySendError::Io(err) => SendError::IoError(err),
}
}
}