flep_protocol/command/
basic.rs1macro_rules! define_basic_command {
3 ($name:ident, $module_name:ident) => {
4 pub use self::$module_name::$name;
5
6 pub mod $module_name {
7 use Command;
8 use std::io::prelude::*;
9
10 #[derive(Clone, Debug, PartialEq, Eq)]
11 pub struct $name;
12
13 impl Command for $name
14 {
15 fn write_payload(&self, _: &mut Write) -> Result<(), $crate::Error> { Ok(()) }
16 fn read_payload(_: &mut BufRead) -> Result<Self, $crate::Error> { Ok($name) }
17
18 fn command_name(&self) -> &'static str { stringify!($name) }
19 }
20
21 #[cfg(test)]
22 mod test
23 {
24 use super::*;
25 use {Command, CommandKind};
26 use std::io;
27
28 #[test]
29 fn correctly_writes_basic_packets() {
30 let packet = $name;
31 let raw_bytes = packet.bytes();
32 let text = String::from_utf8(raw_bytes).unwrap();
33
34 assert_eq!(text, stringify!($name));
35 }
36
37 #[test]
38 fn correctly_reads_basic_packets() {
39 let raw_text = format!("{}\r\n", stringify!($name));
40 let command = CommandKind::read(&mut io::Cursor::new(raw_text.as_bytes().to_vec())).unwrap();
41
42 assert_eq!(command, CommandKind::$name($name));
43 }
44 }
45 }
46 }
47}
48
49define_basic_command!(ABOR, abor);
51define_basic_command!(CDUP, cdup);
53define_basic_command!(FEAT, feat);
55define_basic_command!(EPSV, epsv);
57define_basic_command!(NOOP, noop);
59define_basic_command!(PASV, pasv);
61define_basic_command!(PWD, pwd);
63define_basic_command!(QUIT, quit);
65define_basic_command!(REIN, rein);
67define_basic_command!(STOU, stou);
69define_basic_command!(SYST, syst);