rpgmxp_tool/commands/extract_assets/
vx.rs

1use 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            // TODO: Lock?
34            // TODO: Drop delete guard for file?
35            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}