macro_rules! define_basic_command {
($name:ident, $module_name:ident) => {
pub use self::$module_name::$name;
pub mod $module_name {
use Command;
use std::io::prelude::*;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct $name;
impl Command for $name
{
fn write_payload(&self, _: &mut Write) -> Result<(), $crate::Error> { Ok(()) }
fn read_payload(_: &mut BufRead) -> Result<Self, $crate::Error> { Ok($name) }
fn command_name(&self) -> &'static str { stringify!($name) }
}
#[cfg(test)]
mod test
{
use super::*;
use {Command, CommandKind};
use std::io;
#[test]
fn correctly_writes_basic_packets() {
let packet = $name;
let raw_bytes = packet.bytes();
let text = String::from_utf8(raw_bytes).unwrap();
assert_eq!(text, stringify!($name));
}
#[test]
fn correctly_reads_basic_packets() {
let raw_text = format!("{}\r\n", stringify!($name));
let command = CommandKind::read(&mut io::Cursor::new(raw_text.as_bytes().to_vec())).unwrap();
assert_eq!(command, CommandKind::$name($name));
}
}
}
}
}
define_basic_command!(ABOR, abor);
define_basic_command!(CDUP, cdup);
define_basic_command!(FEAT, feat);
define_basic_command!(EPSV, epsv);
define_basic_command!(NOOP, noop);
define_basic_command!(PASV, pasv);
define_basic_command!(PWD, pwd);
define_basic_command!(QUIT, quit);
define_basic_command!(REIN, rein);
define_basic_command!(STOU, stou);
define_basic_command!(SYST, syst);