rpgmxp_tool/commands/extract_assets/
vx.rs1use super::extract_map_infos;
2use super::extract_ruby_data;
3use super::extract_scripts;
4use super::FileEntry;
5use super::Options;
6use anyhow::Context;
7use std::fs::File;
8use std::path::PathBuf;
9
10pub fn extract(
11 options: &Options,
12 entry: &mut FileEntry<'_>,
13 relative_path_components: Vec<&str>,
14 output_path: PathBuf,
15) -> anyhow::Result<()> {
16 match relative_path_components.as_slice() {
17 ["Data", "Scripts.rvdata"] if !options.skip_extract_scripts => {
18 extract_scripts(entry, output_path)?;
19 }
20 ["Data", "MapInfos.rvdata"] if !options.skip_extract_map_infos => {
21 extract_map_infos(entry, output_path)?;
22 }
23 ["Data", "System.rvdata"] if !options.skip_extract_system => {
24 extract_ruby_data::<rpgmvx_types::System>(entry, output_path)?;
25 }
26 ["Data", file]
27 if !options.skip_extract_maps && crate::util::is_map_file_name(file, "rvdata") =>
28 {
29 extract_ruby_data::<rpgmvx_types::Map>(entry, output_path)?;
30 }
31 _ => {
32 let temp_path = nd_util::with_push_extension(&output_path, "temp");
33 let mut output_file = File::create(&temp_path)
36 .with_context(|| format!("failed to open file at \"{}\"", output_path.display()))?;
37
38 std::io::copy(entry, &mut output_file)?;
39 std::fs::rename(&temp_path, &output_path)?;
40 }
41 }
42
43 Ok(())
44}