sheeter-engine 0.5.0

A CLI tool for converting data files between formats. v0.1.0 supports CSV <-> JSON.
Documentation
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 {
    /// Convert CSV to JSON
    CsvToJson { input: PathBuf, output: PathBuf },
    /// Convert JSON to CSV
    JsonToCsv { input: PathBuf, output: PathBuf },
    /// Convert TSV to JSON
    TsvToJson { input: PathBuf, output: PathBuf },
    /// Convert JSON to TSV
    JsonToTsv { input: PathBuf, output: PathBuf },
    /// Convert CSV to YAML
    CsvToYaml { input: PathBuf, output: PathBuf },
    /// Convert TSV to YAML
    TsvToYaml { input: PathBuf, output: PathBuf },
    /// Convert JSON to YAML
    JsonToYaml { input: PathBuf, output: PathBuf },
    /// Convert YAML to CSV
    YamlToCsv { input: PathBuf, output: PathBuf },
    /// Convert YAML to TSV
    YamlToTsv { input: PathBuf, output: PathBuf },
    /// Convert YAML to JSON
    YamlToJson { input: PathBuf, output: PathBuf },
    /// Convert CSV to TSV
    CsvToTsv { input: PathBuf, output: PathBuf },
    /// Convert TSV to CSV
    TsvToCsv { input: PathBuf, output: PathBuf },
    /// Convert XML to JSON
    XmlToJson { input: PathBuf, output: PathBuf },
    /// Convert JSON to XML
    JsonToXml { input: PathBuf, output: PathBuf },
    /// Convert CSV to XML
    CsvToXml { input: PathBuf, output: PathBuf },
    /// Convert TSV to XML
    TsvToXml { input: PathBuf, output: PathBuf },
    /// Convert YAML to XML
    YamlToXml { input: PathBuf, output: PathBuf },
    /// Convert XML to CSV
    XmlToCsv { input: PathBuf, output: PathBuf },
    /// Convert XML to TSV
    XmlToTsv { input: PathBuf, output: PathBuf },
    /// Convert XML to YAML
    XmlToYaml { input: PathBuf, output: PathBuf },
    /// Convert TOML to JSON
    TomlToJson { input: PathBuf, output: PathBuf },
    /// Convert TOML to CSV
    TomlToCsv { input: PathBuf, output: PathBuf },
    /// Convert TOML to TSV
    TomlToTsv { input: PathBuf, output: PathBuf },
    /// Convert TOML to YAML
    TomlToYaml { input: PathBuf, output: PathBuf },
    /// Convert TOML to XML
    TomlToXml { input: PathBuf, output: PathBuf },
    /// Convert JSON to TOML
    JsonToToml { input: PathBuf, output: PathBuf },
    /// Convert CSV to TOML
    CsvToToml { input: PathBuf, output: PathBuf },
    /// Convert TSV to TOML
    TsvToToml { input: PathBuf, output: PathBuf },
    /// Convert YAML to TOML
    YamlToToml { input: PathBuf, output: PathBuf },
    /// Convert XML to TOML
    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(())
}