88 lines
2.7 KiB
Rust
88 lines
2.7 KiB
Rust
pub mod audio;
|
|
pub mod images;
|
|
pub mod nothing;
|
|
pub mod project;
|
|
|
|
use crate::audio::*;
|
|
use crate::images::*;
|
|
|
|
use clap::Subcommand;
|
|
use std::path::PathBuf;
|
|
use tool_helper::Error;
|
|
|
|
#[derive(Subcommand)]
|
|
pub enum SubCommands {
|
|
Nothing,
|
|
SimpleTIM(reduced_tim::Arguments),
|
|
TIM(tim::Arguments),
|
|
VAG(vag::Arguments),
|
|
XA(xa::Arguments),
|
|
Project(project::Arguments),
|
|
}
|
|
|
|
pub fn run_subcommand(compress_lz4: bool, input_path: Option<PathBuf>, output_path: Option<PathBuf>, sub_command: SubCommands) -> Result<Option<(u16, u16)>, Error> {
|
|
let mut input = tool_helper::open_input(&input_path)?;
|
|
let mut buffer = Vec::<u8>::new();
|
|
let mut output_file = tool_helper::open_output(&output_path)?;
|
|
let dst_buffer = {
|
|
if compress_lz4 {
|
|
&mut buffer as &mut dyn std::io::Write
|
|
}
|
|
|
|
else {
|
|
&mut output_file as &mut dyn std::io::Write
|
|
}
|
|
};
|
|
|
|
let cmd_result: Result<Option<(u16, u16)>, Error> = {
|
|
match sub_command {
|
|
SubCommands::Nothing => {
|
|
nothing::copy(&mut input, dst_buffer)?;
|
|
Ok(None)
|
|
},
|
|
SubCommands::SimpleTIM(args) => {
|
|
Ok(Some(reduced_tim::convert(args, input, dst_buffer)?))
|
|
},
|
|
SubCommands::TIM(args) => {
|
|
Ok(Some(tim::convert(args, input, dst_buffer)?))
|
|
},
|
|
SubCommands::VAG(args) => {
|
|
audio::vag::convert(args, &output_path, input, dst_buffer)?;
|
|
Ok(None)
|
|
}
|
|
SubCommands::XA(args) => {
|
|
audio::xa::convert(args, input, dst_buffer)?;
|
|
Ok(None)
|
|
}
|
|
SubCommands::Project(args) => {
|
|
project::run_project(input, args, input_path, &output_path)?;
|
|
if let Some(file_path) = &output_path {
|
|
let _result = std::fs::remove_file(file_path);
|
|
}
|
|
Ok(None)
|
|
},
|
|
}
|
|
};
|
|
|
|
match cmd_result {
|
|
Ok(cmd_result) => {
|
|
// We encoded the file to a temporary buffer and now need to write it
|
|
if compress_lz4 {
|
|
let buffer = tool_helper::compress::psx_default::lz4(&buffer)?;
|
|
output_file.write(&buffer)?;
|
|
}
|
|
Ok(cmd_result)
|
|
}
|
|
Err(cmd_error) => {
|
|
if let Some(file_path) = output_path {
|
|
let _result = std::fs::remove_file(file_path);
|
|
}
|
|
|
|
else {
|
|
tool_helper::print_warning("Open stream detected! Incomplete file can not be deleted".to_owned());
|
|
}
|
|
|
|
Err(cmd_error)
|
|
}
|
|
}
|
|
} |