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 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}