grafbabe 0.1.1

Simple openmetrics stats collector
use super::parse_ini::parse_ini;
use super::{Command, Config, ConfigError, InfoCommand};
use std::path::PathBuf;

pub fn parse_config() -> Result<Config, ConfigError> {
    let mut config_file: Option<PathBuf> = None;

    let mut args = std::env::args().skip(1);

    let mut command = Command::Serve;

    while args.len() > 0 {
        let arg = args.next().unwrap().to_lowercase();
        match arg.as_str() {
            flag @ "-c" | flag @ "--config-file" => match args.next() {
                Some(s) => config_file = Some(PathBuf::from(s)),
                None => return Err(ConfigError::MissingArgument(flag.to_string())),
            },
            "-h" | "--help" => {
                return Ok(Config {
                    info_command: Some(InfoCommand::Usage),
                    ..Default::default()
                });
            }
            "-v" => {
                return Ok(Config {
                    info_command: Some(InfoCommand::Version),
                    ..Default::default()
                });
            }
            "-vv" | "--version" => {
                return Ok(Config {
                    info_command: Some(InfoCommand::VersionMore),
                    ..Default::default()
                });
            }
            command_str if !command_str.starts_with("-") => match command_str {
                #[cfg(feature = "mock_data")]
                "seed" => match args.next() {
                    Some(path) => command = Command::Seed(path),
                    None => {
                        return Err(ConfigError::MissingCommandArgument(command_str.to_string()));
                    }
                },
                #[cfg(feature = "mock_data")]
                "mock" => match args.next() {
                    Some(path) => command = Command::ServeMockData(path),
                    None => {
                        return Err(ConfigError::MissingCommandArgument(command_str.to_string()));
                    }
                },
                "serve" => command = Command::Serve,
                _ => return Err(ConfigError::UnrecognizedCommand(arg)),
            },
            _ => return Err(ConfigError::UnrecognizedArgument(arg)),
        }
    }

    if let Some(path) = config_file {
        parse_ini(&path)
            .map_err(|e| ConfigError::ParseError(path, e))
            .map(|mut config| {
                config.command = command;
                config
            })
    } else {
        Ok(Config {
            command,
            ..Default::default()
        })
    }
}