From 4fe44b7b79283d2e0fb55e186e36bc39061b3448 Mon Sep 17 00:00:00 2001 From: Danny McGee Date: Thu, 16 Nov 2023 12:55:16 -0500 Subject: [PATCH] Migrate `Result` types to `anyhow` --- Cargo.lock | 2 ++ Cargo.toml | 3 +++ studio/Cargo.toml | 1 + studio/src/interaction/selection.rs | 2 +- studio/src/scene/wasm.rs | 15 +++++++-------- studio/src/wasm/conv.rs | 21 +++++++++++---------- studio/src/wasm/mod.rs | 19 ++++++++++--------- studio_cli/Cargo.toml | 1 + 8 files changed, 36 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e3c4b73..5a650f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3662,6 +3662,7 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" name = "studio" version = "0.1.0" dependencies = [ + "anyhow", "bevy", "bevy-inspector-egui", "bevy_mod_outline", @@ -3683,6 +3684,7 @@ dependencies = [ name = "studio_cli" version = "0.1.0" dependencies = [ + "anyhow", "bevy", "clap", "studio", diff --git a/Cargo.toml b/Cargo.toml index d8bdd85..f490beb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,9 @@ members = [ "./studio_cli", ] +[workspace.dependencies] +anyhow = "1.0.75" + [workspace.dependencies.bevy] version = "0.11.3" features = ["tonemapping_luts"] diff --git a/studio/Cargo.toml b/studio/Cargo.toml index 2324107..57a4020 100644 --- a/studio/Cargo.toml +++ b/studio/Cargo.toml @@ -13,6 +13,7 @@ name = "studio-standalone" path = "src/main.rs" [dependencies] +anyhow = { workspace = true } bevy-inspector-egui = "0.20.0" bevy_mod_raycast = "0.15.0" bevy_rapier3d = "0.22.0" diff --git a/studio/src/interaction/selection.rs b/studio/src/interaction/selection.rs index 2848720..7b18c70 100644 --- a/studio/src/interaction/selection.rs +++ b/studio/src/interaction/selection.rs @@ -146,7 +146,7 @@ declare global { pub(super) fn notify_entity_selection_change( r_selection: Option>, q_window: Query<&Window, With>, - ) -> Result<(), String> { + ) -> anyhow::Result<()> { let entity = r_selection.map(|selection| **selection); wasm::dispatch_to_js(q_window.single(), "entity-select", &entity) } diff --git a/studio/src/scene/wasm.rs b/studio/src/scene/wasm.rs index 0af2f8a..35ae741 100644 --- a/studio/src/scene/wasm.rs +++ b/studio/src/scene/wasm.rs @@ -22,7 +22,7 @@ pub(super) fn scene_download_requested() -> bool { wasm::read_buffer!(SCENE_REQUEST).is_some() } -pub(super) fn save_scene_system(world: &mut World) -> Result<(), String> { +pub(super) fn save_scene_system(world: &mut World) -> anyhow::Result<()> { // Extract all entities with the `Inspectable` marker... let mut scene_entities = world .query_filtered::>() @@ -60,16 +60,15 @@ pub(super) fn save_scene_system(world: &mut World) -> Result<(), String> { let scene = builder.build(); let type_registry = world.resource::(); - let serialized = scene - .serialize_ron(type_registry) - .map_err(|err| format!("{err}"))?; + let serialized = scene.serialize_ron(type_registry)?; let window = world .query_filtered::<&Window, With>() - .get_single(world) - .map_err(|err| format!("{err}"))?; + .get_single(world)?; - wasm::dispatch_to_js(window, "scene-download-ready", &serialized) + wasm::dispatch_to_js(window, "scene-download-ready", &serialized)?; + + Ok(()) } #[wasm_bindgen(typescript_custom_section)] @@ -214,7 +213,7 @@ pub(super) fn notify_entity_spawn_changes( q_names: Query<&Name>, q_parents: Query<&Children>, q_children: Query<&Parent>, -) -> Result<(), String> { +) -> anyhow::Result<()> { l_missing_parents.clear(); l_new_objects.clear(); diff --git a/studio/src/wasm/conv.rs b/studio/src/wasm/conv.rs index da30b98..39a2226 100644 --- a/studio/src/wasm/conv.rs +++ b/studio/src/wasm/conv.rs @@ -1,3 +1,4 @@ +use anyhow::anyhow; use bevy::prelude::{Entity, GlobalTransform, Quat, Transform, Vec3}; use serde::ser::Serialize; use serde_wasm_bindgen::Serializer; @@ -30,7 +31,7 @@ pub(crate) const SERIALIZER: Serializer = Serializer::new() .serialize_large_number_types_as_bigints(true); pub trait AsJsValue { - fn as_js(&self) -> Result; + fn as_js(&self) -> anyhow::Result; } pub trait AsJson { @@ -87,10 +88,10 @@ impl AsJsValue for T where T: AsJson, { - fn as_js(&self) -> Result { + fn as_js(&self) -> anyhow::Result { self.as_json() .serialize(&SERIALIZER) - .map_err(|err| format!("{err}")) + .map_err(|err| anyhow!("{err}")) } } @@ -98,25 +99,25 @@ impl AsJsValue for Vec where T: Serialize, { - fn as_js(&self) -> Result { - self.serialize(&SERIALIZER).map_err(|err| format!("{err}")) + fn as_js(&self) -> anyhow::Result { + self.serialize(&SERIALIZER).map_err(|err| anyhow!("{err}")) } } impl AsJsValue for JsonValue { - fn as_js(&self) -> Result { - self.serialize(&SERIALIZER).map_err(|err| format!("{err}")) + fn as_js(&self) -> anyhow::Result { + self.serialize(&SERIALIZER).map_err(|err| anyhow!("{err}")) } } impl AsJsValue for Entity { - fn as_js(&self) -> Result { + fn as_js(&self) -> anyhow::Result { Ok(JsValue::from_str(&format!("{self:?}"))) } } impl AsJsValue for String { - fn as_js(&self) -> Result { + fn as_js(&self) -> anyhow::Result { Ok(JsValue::from_str(self)) } } @@ -125,7 +126,7 @@ impl AsJsValue for Option where T: AsJsValue, { - fn as_js(&self) -> Result { + fn as_js(&self) -> anyhow::Result { match self.as_ref() { Some(value) => Ok(value.as_js()?), None => Ok(JsValue::NULL), diff --git a/studio/src/wasm/mod.rs b/studio/src/wasm/mod.rs index 022135e..4cad5c5 100644 --- a/studio/src/wasm/mod.rs +++ b/studio/src/wasm/mod.rs @@ -1,5 +1,6 @@ use std::{cell::RefCell, sync::OnceLock}; +use anyhow::anyhow; use bevy::window::Window; use parking_lot::ReentrantMutex; use web_sys::{CustomEvent, CustomEventInit, Element}; @@ -15,7 +16,7 @@ pub(crate) fn dispatch_to_js( event_type: &str, // NOTE: We use dynamic dispatch here to keep the wasm binary small(-ish) value: &dyn AsJsValue, -) -> Result<(), String> { +) -> anyhow::Result<()> { let canvas = try_get_canvas(window)?; let detail = value.as_js()?; @@ -26,32 +27,32 @@ pub(crate) fn dispatch_to_js( .cancelable(true) .detail(&detail), ) - .map_err(|err| format!("{err:?}"))?; + .map_err(|err| anyhow!("{err:?}"))?; canvas .dispatch_event(&event) - .map_err(|err| format!("{err:?}"))?; + .map_err(|err| anyhow!("{err:?}"))?; Ok(()) } -fn try_get_canvas(window: &Window) -> Result { +fn try_get_canvas(window: &Window) -> anyhow::Result { let canvas_selector = window .canvas .as_ref() - .ok_or("Canvas selector not set on Bevy Window".to_string())?; + .ok_or(anyhow!("Canvas selector not set on Bevy Window"))?; - let window = web_sys::window().ok_or("web_sys::window() returned None".to_string())?; + let window = web_sys::window().ok_or(anyhow!("web_sys::window() returned None"))?; let document = window .document() - .ok_or("window.document() returned None".to_string())?; + .ok_or(anyhow!("window.document() returned None"))?; match document.query_selector(canvas_selector) { Ok(Some(canvas)) => Ok(canvas), - Ok(None) => Err(format!( + Ok(None) => Err(anyhow!( "Failed to find element with selector '{canvas_selector}'" )), - Err(err) => Err(format!("JavaScript threw an Error: {err:?}")), + Err(err) => Err(anyhow!("JavaScript threw an Error: {err:?}")), } } diff --git a/studio_cli/Cargo.toml b/studio_cli/Cargo.toml index 8721b6f..dc66336 100644 --- a/studio_cli/Cargo.toml +++ b/studio_cli/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +anyhow = { workspace = true } bevy = { workspace = true } studio = { path = "../studio" }