async-circe/src/commands/parser.rs

83 lines
2.3 KiB
Rust

#[doc(hidden)]
#[derive(Debug)]
pub enum CapMode {
LS,
END,
}
#[derive(Debug)]
pub enum Command {
ADMIN(String),
AWAY(String),
#[doc(hidden)]
CAP(CapMode),
INVITE(String, String),
JOIN(String),
LIST(Option<String>, Option<String>),
MODE(String, Option<String>),
NAMES(String, String),
NICK(String),
OPER(String, String),
OTHER(String),
PART(String),
#[doc(hidden)]
PASS(String),
PING(String),
#[doc(hidden)]
PONG(String, String),
PRIVMSG(String, String, String),
QUIT(String),
TOPIC(String, String),
TOPIC_BY(String, String),
#[doc(hidden)]
USER(String, String, String, String),
}
impl Command {
pub async fn command_from_str(s: String) -> Self {
let new = s.trim();
tracing::trace!("{}", new);
let parts: Vec<&str> = new.split_whitespace().collect();
if parts.get(0) == Some(&"PING") {
return Self::PING(parts[1].to_string());
}
match parts.get(1) {
Some(&"PRIVMSG") => {
let nick_realname = parts[0];
let nick: String;
let index = nick_realname.chars().position(|c| c == '!');
if let Some(index) = index {
if index > 0 {
nick = (nick_realname[1..index]).to_string();
} else {
nick = String::new();
}
} else {
nick = String::new();
}
let msg = parts[3..].join(" ");
Self::PRIVMSG(nick, parts[2].to_string(), (msg[1..]).to_string())
}
Some(&("331" | "332")) => {
let topic = parts[4..].join(" ");
Self::TOPIC(parts[3].to_string(), (topic[1..]).to_string())
}
Some(&"333") => Self::TOPIC_BY(parts[4].to_string(), parts[5].to_string()),
Some(&"353") => {
let user = parts[5..].join(" ");
Self::NAMES(parts[4].to_string(), (user[1..]).to_string())
}
Some(&"PONG") => {
let server = parts[3];
Self::PONG(parts[2].to_string(), (server[1..]).to_string())
}
_ => Self::OTHER(new.to_string()),
}
}
}