use std::fmt;
use std::fmt::Debug;
use std::fmt::Formatter;
use std::sync::mpsc::Sender;
use std::sync::mpsc::SendError;
#[derive(Debug)]
pub enum AdapterMsg {
Outgoing(OutgoingMessage),
Private(OutgoingMessage),
Shutdown
}
#[derive(Debug)]
pub struct OutgoingMessage {
response: String,
incoming: IncomingMessage
}
impl OutgoingMessage {
pub fn new(response: String, incoming: IncomingMessage) -> OutgoingMessage {
OutgoingMessage {
response: response,
incoming: incoming
}
}
pub fn get_incoming<'a>(&'a self) -> &'a IncomingMessage {
&self.incoming
}
pub fn as_bytes(&self) -> &[u8] {
self.response.as_bytes()
}
pub fn as_ref(&self) -> &str {
self.response.as_ref()
}
}
#[derive(Clone)]
pub struct IncomingMessage {
message: String,
from_adapter: String,
server: Option<String>,
channel: Option<String>,
user: Option<String>,
tx: Sender<AdapterMsg>
}
impl IncomingMessage {
pub fn new(from_adapter: String, server: Option<String>, channel: Option<String>,
user: Option<String>, message: String,
sender: Sender<AdapterMsg>) -> IncomingMessage {
IncomingMessage {
from_adapter: from_adapter,
server: server,
channel: channel,
user: user,
message: message,
tx: sender
}
}
pub fn channel(&self) -> Option<&str> {
self.channel.as_ref().map(|chan| chan.as_ref())
}
pub fn user(&self) -> Option<&str> {
self.user.as_ref().map(|user| user.as_ref())
}
pub fn get_contents(&self) -> &str {
self.message.as_ref()
}
pub fn reply(&self, msg: String) -> Result<(), SendError<AdapterMsg>> {
let outgoing = OutgoingMessage::new(msg, self.to_owned());
self.tx.send(AdapterMsg::Outgoing(outgoing))
}
pub fn reply_private(&self, msg: String) -> Result<(), SendError<AdapterMsg>> {
let outgoing = OutgoingMessage::new(msg, self.to_owned());
self.tx.send(AdapterMsg::Private(outgoing))
}
}
impl Debug for IncomingMessage {
fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
write!(f, "IncomingMessage(from_adapter: {:?}, server: {:?}, channel: {:?}, user: {:?}, \
message: {:?})", self.from_adapter, self.server, self.channel, self.user, self.message)
}
}