irc_lib 0.1.4

Simple IRC library with plugin support
Documentation
#[derive(Clone, Debug)]
pub struct User {
    pub nick: String,
    pub r#type: UserType,
}

#[derive(Clone, Debug, PartialEq)]
pub enum UserType {
    Regular,
    Op,
    HalfOp,
}

impl User {
    pub(crate) fn new(nick: &str) -> Self {
        let (perm, nick) = Self::parse_nick(nick);

        let perm = match perm {
            Some('@') => UserType::Op,
            Some('%') => UserType::HalfOp,
            _ => UserType::Regular,
        };

        User {
            nick: nick.to_string(),
            r#type: perm,
        }
    }

    fn parse_nick(input: &str) -> (Option<char>, &str) {
        let mut chars = input.chars();
        let prefix = match chars.next() {
            Some(c) if c == '@' || c == '%' => Some(c),
            Some(_c) => return (None, input),
            None => return (None, ""),
        };
        (prefix, chars.as_str())
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_parse_nick() {
        assert_eq!(User::parse_nick("nick"), (None, "nick"));
        assert_eq!(User::parse_nick("@nick"), (Some('@'), "nick"));
        assert_eq!(User::parse_nick("%nick"), (Some('%'), "nick"));
    }

    #[test]
    fn test_new() {
        let user = User::new("nick");
        assert_eq!(user.nick, "nick");
        assert_eq!(user.r#type, UserType::Regular);

        let user = User::new("@nick");
        assert_eq!(user.nick, "nick");
        assert_eq!(user.r#type, UserType::Op);

        let user = User::new("%nick");
        assert_eq!(user.nick, "nick");
        assert_eq!(user.r#type, UserType::HalfOp);
    }
}