#[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>,
),
#[doc(hidden)]
NICK(String),
OPER(
String,
String,
),
OTHER(String),
PART(
String,
),
#[doc(hidden)]
PASS(String),
#[doc(hidden)]
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 {
#[must_use]
pub fn command_from_str(s: &str) -> Self {
let new = s.trim();
#[cfg(feature = "debug")]
print!("{}", new);
let parts: Vec<&str> = new.split_whitespace().collect();
if parts.get(0) == Some(&"PING") {
let command = parts[1].to_string();
return Self::PONG(command);
} else if parts.get(1) == Some(&"PRIVMSG") {
let nick = parts[0];
let index = nick.chars().position(|c| c == '!').unwrap(); let nick = String::from(&nick[1..index]);
let target = parts[2];
let mut builder = String::new();
for part in parts[3..].to_vec() {
builder.push_str(&format!("{} ", part));
}
return Self::PRIVMSG(nick, target.to_string(), (&builder[1..]).to_string());
}
Self::OTHER(new.to_string())
}
}