enhanced_errors_demo/
enhanced_errors_demo.rs

1//! Demo of enhanced error messages with helpful suggestions
2//!
3//! Run with: cargo run --example `enhanced_errors_demo` -- <args>
4
5use 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}