use clap::{Parser, Subcommand};
use std::fs;
use std::path::PathBuf;
#[derive(Parser)]
#[command(
name = "sheeter",
version,
about = "Convert data files between formats"
)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
CsvToJson { input: PathBuf, output: PathBuf },
JsonToCsv { input: PathBuf, output: PathBuf },
TsvToJson { input: PathBuf, output: PathBuf },
JsonToTsv { input: PathBuf, output: PathBuf },
CsvToYaml { input: PathBuf, output: PathBuf },
TsvToYaml { input: PathBuf, output: PathBuf },
JsonToYaml { input: PathBuf, output: PathBuf },
YamlToCsv { input: PathBuf, output: PathBuf },
YamlToTsv { input: PathBuf, output: PathBuf },
YamlToJson { input: PathBuf, output: PathBuf },
CsvToTsv { input: PathBuf, output: PathBuf },
TsvToCsv { input: PathBuf, output: PathBuf },
XmlToJson { input: PathBuf, output: PathBuf },
JsonToXml { input: PathBuf, output: PathBuf },
CsvToXml { input: PathBuf, output: PathBuf },
TsvToXml { input: PathBuf, output: PathBuf },
YamlToXml { input: PathBuf, output: PathBuf },
XmlToCsv { input: PathBuf, output: PathBuf },
XmlToTsv { input: PathBuf, output: PathBuf },
XmlToYaml { input: PathBuf, output: PathBuf },
TomlToJson { input: PathBuf, output: PathBuf },
TomlToCsv { input: PathBuf, output: PathBuf },
TomlToTsv { input: PathBuf, output: PathBuf },
TomlToYaml { input: PathBuf, output: PathBuf },
TomlToXml { input: PathBuf, output: PathBuf },
JsonToToml { input: PathBuf, output: PathBuf },
CsvToToml { input: PathBuf, output: PathBuf },
TsvToToml { input: PathBuf, output: PathBuf },
YamlToToml { input: PathBuf, output: PathBuf },
XmlToToml { input: PathBuf, output: PathBuf },
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let cli = Cli::parse();
let (sub, input, output) = match &cli.command {
Commands::CsvToJson { input, output } => ("csv", input, output),
Commands::JsonToCsv { input, output } => ("json", input, output),
Commands::TsvToJson { input, output } => ("tsv", input, output),
Commands::JsonToTsv { input, output } => ("json-tsv", input, output),
Commands::CsvToYaml { input, output } => ("csv-yaml", input, output),
Commands::TsvToYaml { input, output } => ("tsv-yaml", input, output),
Commands::JsonToYaml { input, output } => ("json-yaml", input, output),
Commands::YamlToCsv { input, output } => ("yaml-csv", input, output),
Commands::YamlToTsv { input, output } => ("yaml-tsv", input, output),
Commands::YamlToJson { input, output } => ("yaml-json", input, output),
Commands::CsvToTsv { input, output } => ("csv-tsv", input, output),
Commands::TsvToCsv { input, output } => ("tsv-csv", input, output),
Commands::XmlToJson { input, output } => ("xml-json", input, output),
Commands::JsonToXml { input, output } => ("json-xml", input, output),
Commands::CsvToXml { input, output } => ("csv-xml", input, output),
Commands::TsvToXml { input, output } => ("tsv-xml", input, output),
Commands::YamlToXml { input, output } => ("yaml-xml", input, output),
Commands::XmlToCsv { input, output } => ("xml-csv", input, output),
Commands::XmlToTsv { input, output } => ("xml-tsv", input, output),
Commands::XmlToYaml { input, output } => ("xml-yaml", input, output),
Commands::TomlToJson { input, output } => ("toml-json", input, output),
Commands::TomlToCsv { input, output } => ("toml-csv", input, output),
Commands::TomlToTsv { input, output } => ("toml-tsv", input, output),
Commands::TomlToYaml { input, output } => ("toml-yaml", input, output),
Commands::TomlToXml { input, output } => ("toml-xml", input, output),
Commands::JsonToToml { input, output } => ("json-toml", input, output),
Commands::CsvToToml { input, output } => ("csv-toml", input, output),
Commands::TsvToToml { input, output } => ("tsv-toml", input, output),
Commands::YamlToToml { input, output } => ("yaml-toml", input, output),
Commands::XmlToToml { input, output } => ("xml-toml", input, output),
};
let content = fs::read_to_string(input)?;
let result = match sub {
"csv" => sheeter_engine::csv_to_json(&content)?,
"json" => sheeter_engine::json_to_csv(&content)?,
"tsv" => sheeter_engine::tsv_to_json(&content)?,
"json-tsv" => sheeter_engine::json_to_tsv(&content)?,
"csv-yaml" => sheeter_engine::csv_to_yaml(&content)?,
"tsv-yaml" => sheeter_engine::tsv_to_yaml(&content)?,
"json-yaml" => sheeter_engine::json_to_yaml(&content)?,
"yaml-csv" => sheeter_engine::yaml_to_csv(&content)?,
"yaml-tsv" => sheeter_engine::yaml_to_tsv(&content)?,
"yaml-json" => sheeter_engine::yaml_to_json(&content)?,
"csv-tsv" => sheeter_engine::csv_to_tsv(&content)?,
"tsv-csv" => sheeter_engine::tsv_to_csv(&content)?,
"xml-json" => sheeter_engine::xml_to_json(&content)?,
"json-xml" => sheeter_engine::json_to_xml(&content)?,
"csv-xml" => sheeter_engine::csv_to_xml(&content)?,
"tsv-xml" => sheeter_engine::tsv_to_xml(&content)?,
"yaml-xml" => sheeter_engine::yaml_to_xml(&content)?,
"xml-csv" => sheeter_engine::xml_to_csv(&content)?,
"xml-tsv" => sheeter_engine::xml_to_tsv(&content)?,
"xml-yaml" => sheeter_engine::xml_to_yaml(&content)?,
"toml-json" => sheeter_engine::toml_to_json(&content)?,
"toml-csv" => sheeter_engine::toml_to_csv(&content)?,
"toml-tsv" => sheeter_engine::toml_to_tsv(&content)?,
"toml-yaml" => sheeter_engine::toml_to_yaml(&content)?,
"toml-xml" => sheeter_engine::toml_to_xml(&content)?,
"json-toml" => sheeter_engine::json_to_toml(&content)?,
"csv-toml" => sheeter_engine::csv_to_toml(&content)?,
"tsv-toml" => sheeter_engine::tsv_to_toml(&content)?,
"yaml-toml" => sheeter_engine::yaml_to_toml(&content)?,
"xml-toml" => sheeter_engine::xml_to_toml(&content)?,
_ => unreachable!(),
};
fs::write(output, result)?;
Ok(())
}