diff --git a/Cargo.lock b/Cargo.lock index 1b0673579..f1d6541c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1879,6 +1879,7 @@ dependencies = [ "ruffle_macros 0.1.0", "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "swf 0.1.2", + "thiserror 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "weak-table 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/core/Cargo.toml b/core/Cargo.toml index 10a469d3f..cc2208c63 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -28,6 +28,7 @@ downcast-rs = "1.1.1" url = "2.1.0" weak-table = "0.2.3" percent-encoding = "2.1.0" +thiserror = "1.0" [dependencies.jpeg-decoder] version = "0.1.19" diff --git a/core/src/loader.rs b/core/src/loader.rs index 0e7179abf..78651d833 100644 --- a/core/src/loader.rs +++ b/core/src/loader.rs @@ -9,38 +9,38 @@ use crate::tag_utils::SwfMovie; use crate::xml::XMLNode; use gc_arena::{Collect, CollectionContext}; use generational_arena::{Arena, Index}; -use std::fmt; use std::string::FromUtf8Error; use std::sync::{Arc, Mutex, Weak}; +use thiserror::Error; use url::form_urlencoded; pub type Handle = Index; -#[derive(Debug)] +#[derive(Error, Debug)] pub enum LoaderError { + #[error("Load cancelled")] Cancelled, - NotMovieLoader, - NotFormLoader, - NotXmlLoader, - InvalidSwf(crate::tag_utils::Error), - InvalidXmlEncoding(FromUtf8Error), - NetworkError(std::io::Error), - Avm1Error(Box), -} -impl fmt::Display for LoaderError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - LoaderError::Cancelled => f.write_str("Load cancelled"), - LoaderError::NotMovieLoader => f.write_str("Non-movie loader spawned as movie loader"), - LoaderError::NotFormLoader => f.write_str("Non-form loader spawned as form loader"), - LoaderError::NotXmlLoader => f.write_str("Non-XML loader spawned as XML loader"), - LoaderError::InvalidSwf(error) => write!(f, "Invalid SWF: {}", error), - LoaderError::InvalidXmlEncoding(error) => write!(f, "Invalid XML encoding: {}", error), - LoaderError::NetworkError(error) => write!(f, "Network error: {}", error), - LoaderError::Avm1Error(error) => write!(f, "Could not run avm1 script: {}", error), - } - } + #[error("Non-movie loader spawned as movie loader")] + NotMovieLoader, + + #[error("Non-form loader spawned as form loader")] + NotFormLoader, + + #[error("Non-XML loader spawned as XML loader")] + NotXmlLoader, + + #[error("Invalid SWF")] + InvalidSwf(#[from] crate::tag_utils::Error), + + #[error("Invalid XML encoding")] + InvalidXmlEncoding(#[from] FromUtf8Error), + + #[error("Network error")] + NetworkError(#[from] std::io::Error), + + #[error("Error running avm1 script: {0}")] + Avm1Error(Box), } /// Holds all in-progress loads for the player. @@ -322,12 +322,7 @@ impl<'gc> Loader<'gc> { }, )?; - let data = (fetch.await).and_then(|data| { - Ok(( - data.len(), - SwfMovie::from_data(&data).map_err(|e| LoaderError::InvalidSwf(e))?, - )) - }); + let data = (fetch.await).and_then(|data| Ok((data.len(), SwfMovie::from_data(&data)?))); if let Ok((length, movie)) = data { let movie = Arc::new(movie); @@ -548,7 +543,7 @@ impl<'gc> Loader<'gc> { Box::pin(async move { let data = fetch.await; if let Ok(data) = data { - let xmlstring = String::from_utf8(data).map_err(LoaderError::InvalidXmlEncoding)?; + let xmlstring = String::from_utf8(data)?; player.lock().expect("Could not lock player!!").update( |avm, uc| -> Result<(), LoaderError> {