#[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,
Option<String>,
),
NICK(
String,
),
OPER(
String,
String,
),
OTHER(String),
PART(
String,
),
#[doc(hidden)]
PASS(String),
PING(String),
#[doc(hidden)]
PONG(String),
PRIVMSG(
String,
String,
String,
),
QUIT(
String,
),
TOPIC(
String,
Option<String>,
),
#[doc(hidden)]
USER(String, String, String, String),
}
impl Command {
pub async fn command_from_str(s: &str) -> Self {
let new = s.trim();
tracing::trace!("{}", new);
let parts: Vec<&str> = new.split_whitespace().collect();
if parts.get(0) == Some(&"PING") {
let command = parts[1].to_string();
return Self::PING(command);
} else if 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 = String::from(&nick_realname[1..index]);
} else {
nick = String::new();
}
} else {
nick = String::new();
}
let target = parts[2];
let msg = parts[3..].join(" ");
return Self::PRIVMSG(nick, target.to_string(), (msg[1..]).to_string());
}
Self::OTHER(new.to_string())
}
}