diff --git a/server/Cargo.lock b/server/Cargo.lock index ecdd0192..2464935c 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -292,6 +292,26 @@ dependencies = [ "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "failure" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "failure_derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "filetime" version = "0.2.4" @@ -905,6 +925,7 @@ version = "0.5.0" dependencies = [ "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "notify 4.0.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1084,6 +1105,17 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "synstructure" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tempdir" version = "0.3.7" @@ -1414,6 +1446,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" "checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" +"checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7" +"checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596" "checksum filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a2df5c1a8c4be27e7707789dc42ae65976e60b394afd293d1419ab915833e646" "checksum fsevent 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c4bbbf71584aeed076100b5665ac14e3d85eeb31fdbb45fbd41ef9a682b5ec05" "checksum fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a772d36c338d07a032d5375a36f15f9a7043bf0cb8ce7cee658e037c6032874" @@ -1504,6 +1538,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)" = "ae8b29eb5210bc5cf63ed6149cbf9adfc82ac0be023d8735c176ee74a2db4da7" +"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7e91405c14320e5c79b3d148e1c86f40749a36e490642202a31689cb1a3452b2" "checksum term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6b677dd1e8214ea1ef4297f85dbcbed8e8cdddb561040cc998ca2551c37561" diff --git a/server/Cargo.toml b/server/Cargo.toml index 72fe84d8..5b6bfca8 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -30,10 +30,11 @@ rand = "0.4" regex = "1.0" log = "0.4" env_logger = "0.5" +uuid = { version = "0.7", features = ["v4", "serde"] } +failure = "0.1.3" rbx-tree = { git = "https://github.com/LPGhatguy/rbx-tree.git" } rbxmx = { git = "https://github.com/LPGhatguy/rbx-tree.git" } rbxm = { git = "https://github.com/LPGhatguy/rbx-tree.git" } -uuid = { version = "0.7", features = ["v4", "serde"] } [dev-dependencies] tempfile = "3.0" diff --git a/server/src/commands/build.rs b/server/src/commands/build.rs index 70164709..34cb73d7 100644 --- a/server/src/commands/build.rs +++ b/server/src/commands/build.rs @@ -2,9 +2,10 @@ use std::{ path::PathBuf, fs::File, io, - fmt, }; +use failure::Fail; + use crate::{ rbx_session::construct_oneoff_tree, project::{Project, ProjectLoadFuzzyError}, @@ -38,22 +39,16 @@ pub struct BuildOptions { pub output_kind: Option, } +#[derive(Debug, Fail)] pub enum BuildError { + #[fail(display = "Could not detect what kind of file to create")] UnknownOutputKind, - ProjectLoadError(ProjectLoadFuzzyError), - IoError(io::Error), -} -impl fmt::Display for BuildError { - fn fmt(&self, output: &mut fmt::Formatter) -> fmt::Result { - match self { - BuildError::UnknownOutputKind => { - write!(output, "Could not detect what kind of output file to create") - }, - BuildError::ProjectLoadError(inner) => write!(output, "{}", inner), - BuildError::IoError(inner) => write!(output, "{}", inner), - } - } + #[fail(display = "Project load error: {}", _0)] + ProjectLoadError(#[fail(cause)] ProjectLoadFuzzyError), + + #[fail(display = "IO error: {}", _0)] + IoError(#[fail(cause)] io::Error), } impl From for BuildError { diff --git a/server/src/project.rs b/server/src/project.rs index e67834de..539401d9 100644 --- a/server/src/project.rs +++ b/server/src/project.rs @@ -1,17 +1,16 @@ use std::{ collections::HashMap, - fmt, fs, io, path::{Path, PathBuf}, }; -use serde_json; +use failure::Fail; use rbx_tree::RbxValue; pub static PROJECT_FILENAME: &'static str = "roblox-project.json"; -// Serde is silly, +// Serde is silly. const fn yeah() -> bool { true } @@ -89,35 +88,25 @@ impl SourceProject { } } -#[derive(Debug)] +#[derive(Debug, Fail)] pub enum ProjectLoadExactError { - IoError(io::Error), - JsonError(serde_json::Error), + #[fail(display = "IO error: {}", _0)] + IoError(#[fail(cause)] io::Error), + + #[fail(display = "JSON error: {}", _0)] + JsonError(#[fail(cause)] serde_json::Error), } -impl fmt::Display for ProjectLoadExactError { - fn fmt(&self, output: &mut fmt::Formatter) -> fmt::Result { - match self { - ProjectLoadExactError::IoError(inner) => write!(output, "{}", inner), - ProjectLoadExactError::JsonError(inner) => write!(output, "{}", inner), - } - } -} - -#[derive(Debug)] -pub enum ProjectInitError {} - -impl fmt::Display for ProjectInitError { - fn fmt(&self, output: &mut fmt::Formatter) -> fmt::Result { - write!(output, "ProjectInitError") - } -} - -#[derive(Debug)] +#[derive(Debug, Fail)] pub enum ProjectLoadFuzzyError { + #[fail(display = "Project not found")] NotFound, - IoError(io::Error), - JsonError(serde_json::Error), + + #[fail(display = "IO error: {}", _0)] + IoError(#[fail(cause)] io::Error), + + #[fail(display = "JSON error: {}", _0)] + JsonError(#[fail(cause)] serde_json::Error), } impl From for ProjectLoadFuzzyError { @@ -129,24 +118,13 @@ impl From for ProjectLoadFuzzyError { } } -impl fmt::Display for ProjectLoadFuzzyError { - fn fmt(&self, output: &mut fmt::Formatter) -> fmt::Result { - match self { - ProjectLoadFuzzyError::NotFound => write!(output, "Project not found."), - ProjectLoadFuzzyError::IoError(inner) => write!(output, "{}", inner), - ProjectLoadFuzzyError::JsonError(inner) => write!(output, "{}", inner), - } - } -} +#[derive(Debug, Fail)] +#[fail(display = "Project init error")] +pub struct ProjectInitError; -#[derive(Debug)] -pub enum ProjectSaveError {} - -impl fmt::Display for ProjectSaveError { - fn fmt(&self, output: &mut fmt::Formatter) -> fmt::Result { - write!(output, "ProjectSaveError") - } -} +#[derive(Debug, Fail)] +#[fail(display = "Project save error")] +pub struct ProjectSaveError; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "type")]