#[derive(Debug, PartialEq)]
pub enum StatusCodeKind {
TransferStarted,
TransferAboutToStart,
Ok,
FeatureNotImplemented,
SystemStatus,
HelpMessage,
NameSystemType,
ReadyForNewUser,
ClosingControlConnection,
RequestActionCompleted,
UserLoggedIn,
EnteredPassiveMode,
EnteredExtendedPassiveMode,
RequestFileActionCompleted,
PathCreated,
PasswordRequired,
RequestActionPending,
CommandUnrecognized,
SecurityMechanismNotImplemented,
RequestActionDenied,
FileNameNotAllowed,
Unknown,
}
impl From<u16> for StatusCodeKind {
fn from(code: u16) -> StatusCodeKind {
match code {
125 => StatusCodeKind::TransferStarted,
150 => StatusCodeKind::TransferAboutToStart,
200 => StatusCodeKind::Ok,
202 => StatusCodeKind::FeatureNotImplemented,
211 => StatusCodeKind::SystemStatus,
214 => StatusCodeKind::HelpMessage,
215 => StatusCodeKind::NameSystemType,
221 => StatusCodeKind::ClosingControlConnection,
220 => StatusCodeKind::ReadyForNewUser,
226 => StatusCodeKind::RequestActionCompleted,
227 => StatusCodeKind::EnteredPassiveMode,
229 => StatusCodeKind::EnteredExtendedPassiveMode,
230 => StatusCodeKind::UserLoggedIn,
250 => StatusCodeKind::RequestFileActionCompleted,
257 => StatusCodeKind::PathCreated,
331 => StatusCodeKind::PasswordRequired,
350 => StatusCodeKind::RequestActionPending,
500 => StatusCodeKind::CommandUnrecognized,
504 => StatusCodeKind::SecurityMechanismNotImplemented,
550 => StatusCodeKind::RequestActionDenied,
553 => StatusCodeKind::FileNameNotAllowed,
_ => StatusCodeKind::Unknown,
}
}
}
#[derive(Debug)]
pub struct StatusCode {
pub kind: StatusCodeKind,
pub code: u16,
}
impl PartialEq for StatusCode {
fn eq(&self, other: &StatusCode) -> bool {
self.code == other.code
}
}
impl StatusCode {
pub fn parse(text: &str) -> Self {
let code: &u16 = &text[0..3].parse().unwrap();
let code: u16 = *code;
let kind = StatusCodeKind::from(code);
Self { kind, code }
}
pub fn is_valid(&self) -> bool {
self.code > 199 && self.code < 399
}
pub fn is_failure(&self) -> bool {
self.code > 399 && self.code < 599
}
}