triples 0.2.5

A lib and cli for storing data triples
Documentation
use clap::Parser;
use triples::csv_file;
use triples::csv_triples_file;
use triples::db_api::DbApi;
use triples::ttl_file;

#[derive(Parser, Debug, Clone)]
enum Command {
    ImportTurtle,
    ExportTurtle,
    ImportCSV(ImportCsvArgs),
    ExportCSV(ExportCsvArgs),
    ImportTriplesCSV(ImportTriplesCsvArgs),
    ExportTriplesCSV(ExportTriplesCsvArgs),
}

#[derive(Parser, Debug, Clone)]
#[command(author, version, about, long_about = None)]
struct Args {
    #[arg(short, long, default_value = "/tmp/triples.db")]
    db_location: String,

    #[clap(subcommand)]
    command: Command,
}

#[derive(Parser, Debug, Clone)]
struct ImportCsvArgs {
    #[arg(long)]
    subject_default_ns: Option<String>,

    #[arg(long, default_value = "1")]
    subject_column_pos: Option<String>,

    #[arg(long)]
    predicate_default_ns: Option<String>,
}

#[derive(Parser, Debug, Clone)]
struct ImportTriplesCsvArgs {
    #[arg(long)]
    subject_default_ns: Option<String>,

    #[arg(long)]
    predicate_default_ns: Option<String>,

    #[arg(long, default_value = "false")]
    skip_headers: bool,
}

#[derive(Parser, Debug, Clone)]
struct ExportCsvArgs {
    #[arg(long, default_value = "false")]
    export_ns_name: bool,

    #[arg(long)]
    subject_column_name: Option<String>,
}

#[derive(Parser, Debug, Clone)]
struct ExportTriplesCsvArgs {
    #[arg(long, default_value = "false")]
    export_ns_name: bool,

    #[arg(long, default_value = "false")]
    export_headers: bool,
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    tracing_subscriber::fmt::init();
    let args = Args::parse();

    let db_api = DbApi::new(args.db_location).await?;

    match args.command {
        Command::ImportTurtle => ttl_file::import_turtle(&db_api).await?,
        Command::ExportTurtle => ttl_file::export_turtle(&db_api).await?,
        Command::ImportCSV(import_csv_args) => {
            csv_file::import_csv(
                &import_csv_args.subject_default_ns,
                import_csv_args
                    .subject_column_pos
                    .map_or_else(|| Ok(1), |v| v.parse::<i32>())?,
                &import_csv_args.predicate_default_ns,
                &db_api,
            )?;
        }
        Command::ExportCSV(export_csv_args) => {
            csv_file::export_csv(
                export_csv_args.export_ns_name,
                export_csv_args.subject_column_name,
                &db_api,
            )
            .await?;
        }
        Command::ImportTriplesCSV(import_csv_args) => {
            csv_triples_file::import_csv(
                import_csv_args.subject_default_ns,
                import_csv_args.predicate_default_ns,
                import_csv_args.skip_headers,
                &db_api,
            )
            .await?;
        }
        Command::ExportTriplesCSV(export_csv_args) => {
            csv_triples_file::export_csv(
                export_csv_args.export_ns_name,
                export_csv_args.export_headers,
                &db_api,
            )
            .await?;
        }
    }

    Ok(())
}