diff --git a/server/src/commands/build.rs b/server/src/commands/build.rs index 540650ce..14819b51 100644 --- a/server/src/commands/build.rs +++ b/server/src/commands/build.rs @@ -58,29 +58,12 @@ pub enum BuildError { BinaryModelEncodeError(rbx_binary::EncodeError) } -impl From for BuildError { - fn from(error: ProjectLoadFuzzyError) -> BuildError { - BuildError::ProjectLoadError(error) - } -} - -impl From for BuildError { - fn from(error: io::Error) -> BuildError { - BuildError::IoError(error) - } -} - -impl From for BuildError { - fn from(error: rbx_xml::EncodeError) -> BuildError { - BuildError::XmlModelEncodeError(error) - } -} - -impl From for BuildError { - fn from(error: rbx_binary::EncodeError) -> BuildError { - BuildError::BinaryModelEncodeError(error) - } -} +impl_from!(BuildError { + ProjectLoadFuzzyError => ProjectLoadError, + io::Error => IoError, + rbx_xml::EncodeError => XmlModelEncodeError, + rbx_binary::EncodeError => BinaryModelEncodeError +}); pub fn build(options: &BuildOptions) -> Result<(), BuildError> { let output_kind = options.output_kind diff --git a/server/src/commands/init.rs b/server/src/commands/init.rs index 9bc5bd71..b4b0aa69 100644 --- a/server/src/commands/init.rs +++ b/server/src/commands/init.rs @@ -15,11 +15,9 @@ pub enum InitError { ProjectInitError(#[fail(cause)] ProjectInitError) } -impl From for InitError { - fn from(error: ProjectInitError) -> InitError { - InitError::ProjectInitError(error) - } -} +impl_from!(InitError { + ProjectInitError => ProjectInitError, +}); #[derive(Debug)] pub struct InitOptions<'a> { diff --git a/server/src/commands/serve.rs b/server/src/commands/serve.rs index 28d456db..48567d2e 100644 --- a/server/src/commands/serve.rs +++ b/server/src/commands/serve.rs @@ -26,11 +26,9 @@ pub enum ServeError { ProjectLoadError(#[fail(cause)] ProjectLoadFuzzyError), } -impl From for ServeError { - fn from(error: ProjectLoadFuzzyError) -> ServeError { - ServeError::ProjectLoadError(error) - } -} +impl_from!(ServeError { + ProjectLoadFuzzyError => ProjectLoadError, +}); pub fn serve(options: &ServeOptions) -> Result<(), ServeError> { info!("Looking for project at {}", options.fuzzy_project_path.display()); diff --git a/server/src/commands/upload.rs b/server/src/commands/upload.rs index 950783e3..229eae6c 100644 --- a/server/src/commands/upload.rs +++ b/server/src/commands/upload.rs @@ -35,29 +35,12 @@ pub enum UploadError { XmlModelEncodeError(rbx_xml::EncodeError), } -impl From for UploadError { - fn from(error: ProjectLoadFuzzyError) -> UploadError { - UploadError::ProjectLoadError(error) - } -} - -impl From for UploadError { - fn from(error: io::Error) -> UploadError { - UploadError::IoError(error) - } -} - -impl From for UploadError { - fn from(error: reqwest::Error) -> UploadError { - UploadError::HttpError(error) - } -} - -impl From for UploadError { - fn from(error: rbx_xml::EncodeError) -> UploadError { - UploadError::XmlModelEncodeError(error) - } -} +impl_from!(UploadError { + ProjectLoadFuzzyError => ProjectLoadError, + io::Error => IoError, + reqwest::Error => HttpError, + rbx_xml::EncodeError => XmlModelEncodeError, +}); #[derive(Debug)] pub struct UploadOptions<'a> { diff --git a/server/src/impl_from.rs b/server/src/impl_from.rs new file mode 100644 index 00000000..eb26af42 --- /dev/null +++ b/server/src/impl_from.rs @@ -0,0 +1,18 @@ +/// Implements 'From' for a list of variants, intended for use with error enums +/// that are wrapping a number of errors from other methods. +#[macro_export] +macro_rules! impl_from { + ( + $enum_name: ident { + $($error_type: ty => $variant_name: ident),* $(,)* + } + ) => { + $( + impl From<$error_type> for $enum_name { + fn from(error: $error_type) -> $enum_name { + $enum_name::$variant_name(error) + } + } + )* + } +} \ No newline at end of file diff --git a/server/src/lib.rs b/server/src/lib.rs index fb87682f..aee18bc4 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -1,3 +1,8 @@ +// Macros +#[macro_use] +pub mod impl_from; + +// Other modules pub mod commands; pub mod fs_watcher; pub mod imfs;