use {Credentials, Error, FileType};
use io::DataTransferMode;
use {server, protocol};
use std::net::SocketAddr;
use std::path::PathBuf;
#[derive(Clone, Debug)]
pub enum Session
{
PendingWelcome,
Login(Login),
Ready(Ready),
}
#[derive(Clone, Debug)]
pub enum Login
{
WaitingForUsername,
WaitingForPassword {
username: String,
},
}
#[derive(Clone, Debug)]
pub struct Ready
{
pub credentials: Credentials,
pub working_dir: PathBuf,
pub transfer_type: FileType,
pub data_transfer_mode: DataTransferMode,
pub client_addr: Option<SocketAddr>,
pub active_transfer: Option<server::Transfer>,
}
impl Session
{
pub fn expect_ready(&self) -> Result<&Ready, Error> {
if let Session::Ready(ref ready) = *self {
Ok(ready)
} else {
Err(protocol::Error::from_kind(protocol::ErrorKind::NotLoggedIn.into()).into())
}
}
pub fn expect_ready_mut(&mut self) -> Result<&mut Ready, Error> {
if let Session::Ready(ref mut ready) = *self {
Ok(ready)
} else {
Err(protocol::Error::from_kind(protocol::ErrorKind::NotLoggedIn.into()).into())
}
}
pub fn expect_login(&self) -> Result<&Login, Error> {
if let Session::Login(ref login) = *self {
Ok(login)
} else {
Err(protocol::Error::from_kind(protocol::ErrorKind::NotLoggedIn.into()).into())
}
}
}
impl Ready
{
pub fn new(credentials: Credentials) -> Self {
Ready {
credentials: credentials,
working_dir: "/".into(),
transfer_type: FileType::Binary,
data_transfer_mode: DataTransferMode::default(),
client_addr: None,
active_transfer: None,
}
}
}
impl Default for Session
{
fn default() -> Self { Session::PendingWelcome }
}