exporter: Use anyhow to enforce better error messages & Sendability

This commit is contained in:
Nathan Adams 2022-08-08 02:35:24 +02:00 committed by Adrian Wielgosik
parent 3d235ac58f
commit 4499a11c61
3 changed files with 37 additions and 23 deletions

7
Cargo.lock generated
View File

@ -74,6 +74,12 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "anyhow"
version = "1.0.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c794e162a5eff65c72ef524dfe393eb923c354e350bb78b9c7383df13f3bc142"
[[package]] [[package]]
name = "approx" name = "approx"
version = "0.5.1" version = "0.5.1"
@ -1212,6 +1218,7 @@ checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71"
name = "exporter" name = "exporter"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow",
"clap", "clap",
"futures", "futures",
"image", "image",

View File

@ -14,6 +14,7 @@ image = "0.24.2"
log = "0.4" log = "0.4"
walkdir = "2.3.2" walkdir = "2.3.2"
indicatif = "0.17" indicatif = "0.17"
anyhow = "1.0"
[features] [features]
avm_debug = ["ruffle_core/avm_debug"] avm_debug = ["ruffle_core/avm_debug"]

View File

@ -1,3 +1,4 @@
use anyhow::{anyhow, Result};
use clap::Parser; use clap::Parser;
use image::RgbaImage; use image::RgbaImage;
use indicatif::{ProgressBar, ProgressStyle}; use indicatif::{ProgressBar, ProgressStyle};
@ -6,7 +7,6 @@ use ruffle_core::PlayerBuilder;
use ruffle_render_wgpu::clap::{GraphicsBackend, PowerPreference}; use ruffle_render_wgpu::clap::{GraphicsBackend, PowerPreference};
use ruffle_render_wgpu::target::TextureTarget; use ruffle_render_wgpu::target::TextureTarget;
use ruffle_render_wgpu::{wgpu, Descriptors, WgpuRenderBackend}; use ruffle_render_wgpu::{wgpu, Descriptors, WgpuRenderBackend};
use std::error::Error;
use std::fs::create_dir_all; use std::fs::create_dir_all;
use std::panic::catch_unwind; use std::panic::catch_unwind;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
@ -81,8 +81,8 @@ fn take_screenshot(
skipframes: u32, skipframes: u32,
progress: &Option<ProgressBar>, progress: &Option<ProgressBar>,
size: SizeOpt, size: SizeOpt,
) -> Result<Vec<RgbaImage>, Box<dyn std::error::Error>> { ) -> Result<Vec<RgbaImage>> {
let movie = SwfMovie::from_path(&swf_path, None)?; let movie = SwfMovie::from_path(&swf_path, None).map_err(|e| anyhow!(e.to_string()))?;
let width = size let width = size
.width .width
@ -98,7 +98,9 @@ fn take_screenshot(
let target = TextureTarget::new(&descriptors.device, (width, height)); let target = TextureTarget::new(&descriptors.device, (width, height));
let player = PlayerBuilder::new() let player = PlayerBuilder::new()
.with_renderer(WgpuRenderBackend::new(descriptors, target)?) .with_renderer(
WgpuRenderBackend::new(descriptors, target).map_err(|e| anyhow!(e.to_string()))?,
)
.with_software_video() .with_software_video()
.with_movie(movie) .with_movie(movie)
.with_viewport_dimensions(width, height, size.scale as f64) .with_viewport_dimensions(width, height, size.scale as f64)
@ -127,13 +129,14 @@ fn take_screenshot(
renderer.capture_frame() renderer.capture_frame()
}) { }) {
Ok(Some(image)) => result.push(image), Ok(Some(image)) => result.push(image),
Ok(None) => { Ok(None) => return Err(anyhow!("Unable to capture frame {} of {:?}", i, swf_path)),
return Err(format!("Unable to capture frame {} of {:?}", i, swf_path).into())
}
Err(e) => { Err(e) => {
return Err( return Err(anyhow!(
format!("Unable to capture frame {} of {:?}: {:?}", i, swf_path, e).into(), "Unable to capture frame {} of {:?}: {:?}",
) i,
swf_path,
e
))
} }
} }
} }
@ -175,7 +178,7 @@ fn find_files(root: &Path, with_progress: bool) -> Vec<DirEntry> {
results results
} }
fn capture_single_swf(descriptors: Arc<Descriptors>, opt: &Opt) -> Result<(), Box<dyn Error>> { fn capture_single_swf(descriptors: Arc<Descriptors>, opt: &Opt) -> Result<()> {
let output = opt.output_path.clone().unwrap_or_else(|| { let output = opt.output_path.clone().unwrap_or_else(|| {
let mut result = PathBuf::new(); let mut result = PathBuf::new();
result.set_file_name(opt.swf.file_stem().unwrap()); result.set_file_name(opt.swf.file_stem().unwrap());
@ -251,7 +254,7 @@ fn capture_single_swf(descriptors: Arc<Descriptors>, opt: &Opt) -> Result<(), Bo
} }
#[allow(clippy::branches_sharing_code)] #[allow(clippy::branches_sharing_code)]
fn capture_multiple_swfs(descriptors: Arc<Descriptors>, opt: &Opt) -> Result<(), Box<dyn Error>> { fn capture_multiple_swfs(descriptors: Arc<Descriptors>, opt: &Opt) -> Result<()> {
let output = opt.output_path.clone().unwrap(); let output = opt.output_path.clone().unwrap();
let files = find_files(&opt.swf, !opt.silent); let files = find_files(&opt.swf, !opt.silent);
@ -355,25 +358,28 @@ fn trace_path(_opt: &Opt) -> Option<&Path> {
None None
} }
fn main() -> Result<(), Box<dyn Error>> { fn main() -> Result<()> {
let opt: Opt = Opt::parse(); let opt: Opt = Opt::parse();
let instance = wgpu::Instance::new(opt.graphics.into()); let instance = wgpu::Instance::new(opt.graphics.into());
let descriptors = Arc::new(futures::executor::block_on(WgpuRenderBackend::< let descriptors = Arc::new(
TextureTarget, futures::executor::block_on(WgpuRenderBackend::<TextureTarget>::build_descriptors(
>::build_descriptors( opt.graphics.into(),
opt.graphics.into(), instance,
instance, None,
None, opt.power.into(),
opt.power.into(), trace_path(&opt),
trace_path(&opt), ))
))?); .map_err(|e| anyhow!(e.to_string()))?,
);
if opt.swf.is_file() { if opt.swf.is_file() {
capture_single_swf(descriptors, &opt)?; capture_single_swf(descriptors, &opt)?;
} else if opt.output_path.is_some() { } else if opt.output_path.is_some() {
capture_multiple_swfs(descriptors, &opt)?; capture_multiple_swfs(descriptors, &opt)?;
} else { } else {
return Err("Output directory is required when exporting multiple files.".into()); return Err(anyhow!(
"Output directory is required when exporting multiple files."
));
} }
Ok(()) Ok(())