use anyhow::Result;
use clap::Args;
use gen_models::{errors::OperationError, sample::Sample};
use crate::{
commands::{cli_context::CliContext, get_default_collection},
graphs::combinatorial_library::parse_library,
imports::library::{LibraryImportError, import_library},
};
#[derive(Debug, Args, Clone)]
pub struct Command {
#[clap(index = 1)]
library_name: String,
#[clap(index = 2)]
parts: Option<String>,
#[clap(index = 3)]
library: Option<String>,
#[arg(short, long)]
name: Option<String>,
#[arg(short, long, default_value_t = Sample::DEFAULT_NAME.to_string())]
sample: String,
}
pub fn execute(cli_context: &CliContext, cmd: Command) -> Result<()> {
println!("Library import called");
let context = cli_context.context;
let operation_conn = context.operations().conn();
let conn = context.graph().conn();
conn.execute("BEGIN TRANSACTION", []).unwrap();
operation_conn.execute("BEGIN TRANSACTION", []).unwrap();
let name = &cmd
.name
.clone()
.unwrap_or_else(|| get_default_collection(operation_conn));
let parts_list = parse_library(&cmd.parts.clone().unwrap(), &cmd.library.clone().unwrap())?;
let parts_path = cmd.parts.unwrap();
let library_path = cmd.library.unwrap();
match import_library(
context,
name,
cmd.sample.as_str(),
&cmd.library_name,
parts_list,
Some(&parts_path),
Some(&library_path),
) {
Ok(_) => {
println!("Imported library file {library_path} and parts file {parts_path}");
conn.execute("END TRANSACTION;", []).unwrap();
operation_conn.execute("END TRANSACTION;", []).unwrap();
Ok(())
}
Err(LibraryImportError::OperationError(OperationError::NoChanges)) => {
conn.execute("ROLLBACK TRANSACTION;", []).unwrap();
operation_conn.execute("ROLLBACK TRANSACTION;", []).unwrap();
println!("Library already exists.");
Ok(())
}
Err(e) => {
println!("Library import failed: {}", e);
Err(e.into())
}
}
}