use crate::{constants::*, options::ExplicitColumnType};
use crate::{Error, Result};
use clap::Parser;
use std::path::PathBuf;
pub fn parse() -> Opts {
Opts::parse()
}
#[derive(Debug, Parser)]
pub struct Opts {
#[clap(short, long, parse(from_os_str), default_value = "/dev/stdin")]
pub input_file: PathBuf,
#[clap(short, long, parse(from_os_str), default_value = "/dev/stdout")]
pub output_file: PathBuf,
#[clap(short, long, default_value_t = DEFAULT_DELIMITER, parse(try_from_str = unescape_delimiter))]
pub delimiter: char,
#[clap(short, long)]
pub width_adjustment: bool,
#[clap(short, long, default_value = DEFAULT_SHEET_NAME)]
pub sheet_name: String,
#[clap(short, long)]
pub explicit_column_types: Vec<ExplicitColumnType>,
#[clap(subcommand)]
pub subcommand: Option<Subcommand>,
}
#[derive(Debug, clap::Subcommand)]
pub enum Subcommand {
Version,
}
fn unescape_delimiter(src: &str) -> Result<char> {
if src.len() == 1 {
let c: char = unescape::unescape(src)
.ok_or(Error::InvalidDelimiter)?
.chars()
.next()
.unwrap();
Ok(c)
} else {
Err(Error::InvalidDelimiter)
}
}