irclap 0.1.0

Bridge between irc and clap to enable better bot command parsing
Documentation
use irc::client::prelude as ircp;
use irc::client::prelude::ChannelExt;
use irc::client::prelude::ClientExt;

use IrclapResponseStream;

pub(crate) struct IrcResponseStream<'c> {
    client: &'c ircp::IrcClient,
    response_target: &'c str,
}

impl<'c> IrcResponseStream<'c> {
    pub(crate) fn new(client: &'c ircp::IrcClient, rt: &'c str) -> IrcResponseStream<'c> {
        IrcResponseStream {
            client: client,
            response_target: rt,
        }
    }
}

impl<'c> IrclapResponseStream for IrcResponseStream<'c> {
    fn send_message(&self, msg: &str) -> Result<(), ::irc::error::IrcError>{
        if self.response_target.is_channel_name() {
            self.client.send_notice(self.response_target, msg)
        } else {
            self.client.send_privmsg(self.response_target, msg)
        }
    }
}

fn strip_botname<'m>(botname: &str, msg: &'m str) -> Option<&'m str> {
    if msg.starts_with(botname) {
        Some(&msg[botname.len()..].trim_matches(':').trim_matches(',').trim())
    } else {
        None
    }
}

pub(crate) fn extract_command<'m>(botname:&str, msg: &'m ircp::Message) -> Option<&'m str> {
    let is_channel = msg.response_target().map(|rt| rt.is_channel_name()).unwrap_or(false);
    match msg.command {
        ircp::Command::PRIVMSG(_, ref m) if is_channel => strip_botname(botname, m),
        ircp::Command::PRIVMSG(_, ref m) => strip_botname(botname, m).or(Some(m)),
        _ => None
    }
}

#[cfg(test)]
mod test {
    use super::*;
    use irc::client::prelude::Message;

    #[test]
    fn can_strip_botname_from_msg() {
        let msg = Message::new(Some("usr"), "PRIVMSG", vec!["#chan"], Some("bot: Hi")).unwrap();
        assert_eq!(extract_command("bot", &msg), Some("Hi"));

        let msg = Message::new(Some("usr"), "PRIVMSG", vec!["usr"], Some("bot: Hi")).unwrap();
        assert_eq!(extract_command("bot", &msg), Some("Hi"));
    }

}