csv_processor/
config.rs

1#[derive(Debug, PartialEq)]
2pub enum Command {
3    CheckNAs,
4    Info,
5}
6
7#[derive(Debug, PartialEq)]
8pub enum ConfigError {
9    UnknownCommand(String),
10    MissingArguments(String),
11    FileNotFound(String),
12}
13
14#[derive(Debug)]
15pub struct Config {
16    command: Command,
17    filename: String,
18}
19
20impl std::fmt::Display for ConfigError {
21    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
22        match self {
23            ConfigError::UnknownCommand(cmd) => {
24                write!(
25                    f,
26                    "Unknown command '{}'. Available: na, info",
27                    cmd
28                )
29            }
30            ConfigError::MissingArguments(msg) => write!(f, "{}", msg),
31            ConfigError::FileNotFound(file) => write!(f, "File '{}' not found", file),
32        }
33    }
34}
35
36impl std::error::Error for ConfigError {}
37
38impl Config {
39    pub fn new(command: Command, filename: String) -> Config {
40        Config { command, filename }
41    }
42
43    pub fn command(&self) -> &Command {
44        &self.command
45    }
46
47    pub fn filename(&self) -> &str {
48        &self.filename
49    }
50}
51
52pub fn parse_command(command: String) -> Result<Command, ConfigError> {
53    match command.to_lowercase().as_str() {
54        "na" => Ok(Command::CheckNAs),
55        "info" => Ok(Command::Info),
56        _ => Err(ConfigError::UnknownCommand(command)),
57    }
58}
59
60pub fn print_help() {
61    println!("CSV Analytics Tool");
62    println!();
63    println!("USAGE:");
64    println!("    csv_processor <COMMAND> <FILE>");
65    println!();
66    println!("COMMANDS:");
67    println!("    na      Check for missing values (NAs) in CSV file");
68    println!("    info    Calculate statistics for CSV file");
69    println!();
70    println!("EXAMPLES:");
71    println!("    csv_processor na sample.csv");
72    println!("    csv_processor info sample.csv");
73}
74
75pub fn parse_config(args: &[String]) -> Result<Config, ConfigError> {
76    // Check for help flags
77    if args.len() == 1 || (args.len() == 2 && (args[1] == "--help" || args[1] == "-h" || args[1] == "help")) {
78        print_help();
79        std::process::exit(0);
80    }
81
82    if args.len() < 3 {
83        return Err(ConfigError::MissingArguments(
84            "Not enough arguments passed!".to_string(),
85        ));
86    }
87
88    let command = parse_command(args[1].clone())?;
89    Ok(Config::new(command, args[2].clone()))
90}