enhanced_errors_demo/
enhanced_errors_demo.rs1use flag_rs::{CommandBuilder, Flag, FlagConstraint, FlagType};
6
7fn main() {
8 let app = CommandBuilder::new("errordemo")
9 .short("Demo of enhanced error messages")
10 .flag(
11 Flag::new("verbose")
12 .short('v')
13 .value_type(FlagType::Bool)
14 .usage("Enable verbose output"),
15 )
16 .flag(
17 Flag::new("workers")
18 .short('w')
19 .value_type(FlagType::Range(1, 10))
20 .usage("Number of worker threads"),
21 )
22 .flag(
23 Flag::new("format")
24 .short('f')
25 .value_type(FlagType::Choice(vec![
26 "json".to_string(),
27 "yaml".to_string(),
28 "xml".to_string(),
29 "toml".to_string(),
30 ]))
31 .usage("Output format"),
32 )
33 .flag(
34 Flag::new("config")
35 .short('c')
36 .value_type(FlagType::File)
37 .usage("Configuration file"),
38 )
39 .flag(
40 Flag::new("outdir")
41 .short('o')
42 .value_type(FlagType::Directory)
43 .usage("Output directory"),
44 )
45 .flag(
46 Flag::new("ssl")
47 .value_type(FlagType::Bool)
48 .usage("Enable SSL"),
49 )
50 .flag(
51 Flag::new("ssl-cert")
52 .value_type(FlagType::File)
53 .constraint(FlagConstraint::RequiredIf("ssl".to_string()))
54 .usage("SSL certificate file"),
55 )
56 .flag(
57 Flag::new("json")
58 .value_type(FlagType::Bool)
59 .constraint(FlagConstraint::ConflictsWith(vec!["xml".to_string()]))
60 .usage("Output in JSON format"),
61 )
62 .flag(
63 Flag::new("xml")
64 .value_type(FlagType::Bool)
65 .usage("Output in XML format"),
66 )
67 .flag(
68 Flag::new("required-flag")
69 .value_type(FlagType::String)
70 .required()
71 .usage("This flag is required"),
72 )
73 .subcommand(
74 CommandBuilder::new("process")
75 .short("Process data")
76 .run(|ctx| {
77 println!("Processing with flags: {:?}", ctx.flags());
78 Ok(())
79 })
80 .build(),
81 )
82 .build();
83
84 println!("Try these commands to see enhanced error messages:\n");
85 println!(" # Boolean parsing error");
86 println!(" cargo run --example enhanced_errors_demo -- --verbose=maybe\n");
87
88 println!(" # Integer parsing error");
89 println!(" cargo run --example enhanced_errors_demo -- --workers=abc\n");
90
91 println!(" # Range validation error");
92 println!(" cargo run --example enhanced_errors_demo -- --workers=20\n");
93
94 println!(" # Choice validation error");
95 println!(" cargo run --example enhanced_errors_demo -- --format=csv\n");
96
97 println!(" # File not found error");
98 println!(" cargo run --example enhanced_errors_demo -- --config=/tmp/nonexistent.conf\n");
99
100 println!(" # Directory not found error");
101 println!(" cargo run --example enhanced_errors_demo -- --outdir=/tmp/nonexistent_dir\n");
102
103 println!(" # Flag constraint error (RequiredIf)");
104 println!(" cargo run --example enhanced_errors_demo -- --ssl --required-flag=test process\n");
105
106 println!(" # Flag constraint error (ConflictsWith)");
107 println!(
108 " cargo run --example enhanced_errors_demo -- --json --xml --required-flag=test process\n"
109 );
110
111 println!(" # Required flag error");
112 println!(" cargo run --example enhanced_errors_demo -- process\n");
113
114 println!(" # Unknown command error");
115 println!(" cargo run --example enhanced_errors_demo -- --required-flag=test proces\n");
116
117 let args: Vec<String> = std::env::args().skip(1).collect();
118 if !args.is_empty() {
119 println!("\n{}", "=".repeat(60));
120 println!("Running with args: {:?}\n", args);
121
122 if let Err(e) = app.execute(args) {
123 eprintln!("{}", e);
124 std::process::exit(1);
125 }
126 }
127}