trivial_argument_parser/argument/
builder.rs1use crate::argument::legacy_argument::{ArgType, Argument};
2
3pub struct ArgBuilder {
4 arg_type: ArgType,
5 short_name: Option<char>,
6 long_name: Option<String>,
7}
8
9impl ArgBuilder {
10 pub fn new(arg_type: ArgType) -> ArgBuilder {
12 return ArgBuilder {
13 arg_type,
14 short_name: None,
15 long_name: None,
16 };
17 }
18
19 pub fn set_short_name(mut self, short_name: char) -> ArgBuilder {
20 self.short_name = Some(short_name);
21 return self;
22 }
23
24 pub fn set_long_name(mut self, long_name: &str) -> ArgBuilder {
25 self.long_name = Some(String::from(long_name));
26 return self;
27 }
28
29 pub fn set_type(mut self, new_type: ArgType) -> ArgBuilder {
30 self.arg_type = new_type;
31 return self;
32 }
33
34 pub fn build(&self) -> Result<Argument, String> {
35 let long = if let Some(ref l) = self.long_name {
36 Option::Some(l.as_str())
37 } else {
38 Option::None
39 };
40 Argument::new(self.short_name, long, self.arg_type)
41 }
42}
43
44#[cfg(test)]
45mod tests {
46 use super::{ArgBuilder, ArgType};
47
48 #[test]
49 fn new_works() {
50 let arg_builder = ArgBuilder::new(ArgType::Value);
51 assert_eq!(arg_builder.long_name, Option::None);
52 assert_eq!(arg_builder.short_name, Option::None);
53 assert_eq!(arg_builder.arg_type, ArgType::Value);
54 }
55
56 #[test]
57 fn build_short_works() {
58 let arg = ArgBuilder::new(ArgType::Value)
59 .set_short_name('x')
60 .build()
61 .unwrap();
62 assert_eq!(arg.short(), &Option::Some('x'));
63 assert_eq!(arg.long(), &Option::None);
64 assert_eq!(arg.arg_type(), &ArgType::Value);
65 }
66
67 #[test]
68 fn build_long_works() {
69 let arg = ArgBuilder::new(ArgType::Value)
70 .set_long_name("my_arg")
71 .build()
72 .unwrap();
73 assert_eq!(arg.long(), &Option::Some(String::from("my_arg")));
74 assert_eq!(arg.short(), &Option::None);
75 assert_eq!(arg.arg_type(), &ArgType::Value);
76 }
77
78 #[test]
79 fn build_both_works() {
80 let arg = ArgBuilder::new(ArgType::Value)
81 .set_long_name("my_arg")
82 .set_short_name('x')
83 .build()
84 .unwrap();
85 assert_eq!(arg.long(), &Option::Some(String::from("my_arg")));
86 assert_eq!(arg.short(), &Option::Some('x'));
87 assert_eq!(arg.arg_type(), &ArgType::Value);
88 }
89
90 #[test]
91 fn set_type_works() {
92 let arg = ArgBuilder::new(ArgType::Value)
93 .set_long_name("my_arg")
94 .set_type(ArgType::Flag)
95 .build()
96 .unwrap();
97 assert_eq!(arg.long(), &Option::Some(String::from("my_arg")));
98 assert_eq!(arg.short(), &Option::None);
99 assert_eq!(arg.arg_type(), &ArgType::Flag);
100 }
101}