Migrate Result types to anyhow

This commit is contained in:
Danny McGee
2023-11-16 12:55:16 -05:00
parent d451b1bb90
commit 4fe44b7b79
8 changed files with 36 additions and 28 deletions
Generated
+2
View File
@@ -3662,6 +3662,7 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
name = "studio" name = "studio"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow",
"bevy", "bevy",
"bevy-inspector-egui", "bevy-inspector-egui",
"bevy_mod_outline", "bevy_mod_outline",
@@ -3683,6 +3684,7 @@ dependencies = [
name = "studio_cli" name = "studio_cli"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow",
"bevy", "bevy",
"clap", "clap",
"studio", "studio",
+3
View File
@@ -6,6 +6,9 @@ members = [
"./studio_cli", "./studio_cli",
] ]
[workspace.dependencies]
anyhow = "1.0.75"
[workspace.dependencies.bevy] [workspace.dependencies.bevy]
version = "0.11.3" version = "0.11.3"
features = ["tonemapping_luts"] features = ["tonemapping_luts"]
+1
View File
@@ -13,6 +13,7 @@ name = "studio-standalone"
path = "src/main.rs" path = "src/main.rs"
[dependencies] [dependencies]
anyhow = { workspace = true }
bevy-inspector-egui = "0.20.0" bevy-inspector-egui = "0.20.0"
bevy_mod_raycast = "0.15.0" bevy_mod_raycast = "0.15.0"
bevy_rapier3d = "0.22.0" bevy_rapier3d = "0.22.0"
+1 -1
View File
@@ -146,7 +146,7 @@ declare global {
pub(super) fn notify_entity_selection_change( pub(super) fn notify_entity_selection_change(
r_selection: Option<Res<Selection>>, r_selection: Option<Res<Selection>>,
q_window: Query<&Window, With<PrimaryWindow>>, q_window: Query<&Window, With<PrimaryWindow>>,
) -> Result<(), String> { ) -> anyhow::Result<()> {
let entity = r_selection.map(|selection| **selection); let entity = r_selection.map(|selection| **selection);
wasm::dispatch_to_js(q_window.single(), "entity-select", &entity) wasm::dispatch_to_js(q_window.single(), "entity-select", &entity)
} }
+7 -8
View File
@@ -22,7 +22,7 @@ pub(super) fn scene_download_requested() -> bool {
wasm::read_buffer!(SCENE_REQUEST).is_some() 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... // Extract all entities with the `Inspectable` marker...
let mut scene_entities = world let mut scene_entities = world
.query_filtered::<Entity, With<Inspectable>>() .query_filtered::<Entity, With<Inspectable>>()
@@ -60,16 +60,15 @@ pub(super) fn save_scene_system(world: &mut World) -> Result<(), String> {
let scene = builder.build(); let scene = builder.build();
let type_registry = world.resource::<AppTypeRegistry>(); let type_registry = world.resource::<AppTypeRegistry>();
let serialized = scene let serialized = scene.serialize_ron(type_registry)?;
.serialize_ron(type_registry)
.map_err(|err| format!("{err}"))?;
let window = world let window = world
.query_filtered::<&Window, With<PrimaryWindow>>() .query_filtered::<&Window, With<PrimaryWindow>>()
.get_single(world) .get_single(world)?;
.map_err(|err| format!("{err}"))?;
wasm::dispatch_to_js(window, "scene-download-ready", &serialized) wasm::dispatch_to_js(window, "scene-download-ready", &serialized)?;
Ok(())
} }
#[wasm_bindgen(typescript_custom_section)] #[wasm_bindgen(typescript_custom_section)]
@@ -214,7 +213,7 @@ pub(super) fn notify_entity_spawn_changes(
q_names: Query<&Name>, q_names: Query<&Name>,
q_parents: Query<&Children>, q_parents: Query<&Children>,
q_children: Query<&Parent>, q_children: Query<&Parent>,
) -> Result<(), String> { ) -> anyhow::Result<()> {
l_missing_parents.clear(); l_missing_parents.clear();
l_new_objects.clear(); l_new_objects.clear();
+11 -10
View File
@@ -1,3 +1,4 @@
use anyhow::anyhow;
use bevy::prelude::{Entity, GlobalTransform, Quat, Transform, Vec3}; use bevy::prelude::{Entity, GlobalTransform, Quat, Transform, Vec3};
use serde::ser::Serialize; use serde::ser::Serialize;
use serde_wasm_bindgen::Serializer; use serde_wasm_bindgen::Serializer;
@@ -30,7 +31,7 @@ pub(crate) const SERIALIZER: Serializer = Serializer::new()
.serialize_large_number_types_as_bigints(true); .serialize_large_number_types_as_bigints(true);
pub trait AsJsValue { pub trait AsJsValue {
fn as_js(&self) -> Result<JsValue, String>; fn as_js(&self) -> anyhow::Result<JsValue>;
} }
pub trait AsJson { pub trait AsJson {
@@ -87,10 +88,10 @@ impl<T> AsJsValue for T
where where
T: AsJson, T: AsJson,
{ {
fn as_js(&self) -> Result<JsValue, String> { fn as_js(&self) -> anyhow::Result<JsValue> {
self.as_json() self.as_json()
.serialize(&SERIALIZER) .serialize(&SERIALIZER)
.map_err(|err| format!("{err}")) .map_err(|err| anyhow!("{err}"))
} }
} }
@@ -98,25 +99,25 @@ impl<T> AsJsValue for Vec<T>
where where
T: Serialize, T: Serialize,
{ {
fn as_js(&self) -> Result<JsValue, String> { fn as_js(&self) -> anyhow::Result<JsValue> {
self.serialize(&SERIALIZER).map_err(|err| format!("{err}")) self.serialize(&SERIALIZER).map_err(|err| anyhow!("{err}"))
} }
} }
impl AsJsValue for JsonValue { impl AsJsValue for JsonValue {
fn as_js(&self) -> Result<JsValue, String> { fn as_js(&self) -> anyhow::Result<JsValue> {
self.serialize(&SERIALIZER).map_err(|err| format!("{err}")) self.serialize(&SERIALIZER).map_err(|err| anyhow!("{err}"))
} }
} }
impl AsJsValue for Entity { impl AsJsValue for Entity {
fn as_js(&self) -> Result<JsValue, String> { fn as_js(&self) -> anyhow::Result<JsValue> {
Ok(JsValue::from_str(&format!("{self:?}"))) Ok(JsValue::from_str(&format!("{self:?}")))
} }
} }
impl AsJsValue for String { impl AsJsValue for String {
fn as_js(&self) -> Result<JsValue, String> { fn as_js(&self) -> anyhow::Result<JsValue> {
Ok(JsValue::from_str(self)) Ok(JsValue::from_str(self))
} }
} }
@@ -125,7 +126,7 @@ impl<T> AsJsValue for Option<T>
where where
T: AsJsValue, T: AsJsValue,
{ {
fn as_js(&self) -> Result<JsValue, String> { fn as_js(&self) -> anyhow::Result<JsValue> {
match self.as_ref() { match self.as_ref() {
Some(value) => Ok(value.as_js()?), Some(value) => Ok(value.as_js()?),
None => Ok(JsValue::NULL), None => Ok(JsValue::NULL),
+10 -9
View File
@@ -1,5 +1,6 @@
use std::{cell::RefCell, sync::OnceLock}; use std::{cell::RefCell, sync::OnceLock};
use anyhow::anyhow;
use bevy::window::Window; use bevy::window::Window;
use parking_lot::ReentrantMutex; use parking_lot::ReentrantMutex;
use web_sys::{CustomEvent, CustomEventInit, Element}; use web_sys::{CustomEvent, CustomEventInit, Element};
@@ -15,7 +16,7 @@ pub(crate) fn dispatch_to_js(
event_type: &str, event_type: &str,
// NOTE: We use dynamic dispatch here to keep the wasm binary small(-ish) // NOTE: We use dynamic dispatch here to keep the wasm binary small(-ish)
value: &dyn AsJsValue, value: &dyn AsJsValue,
) -> Result<(), String> { ) -> anyhow::Result<()> {
let canvas = try_get_canvas(window)?; let canvas = try_get_canvas(window)?;
let detail = value.as_js()?; let detail = value.as_js()?;
@@ -26,32 +27,32 @@ pub(crate) fn dispatch_to_js(
.cancelable(true) .cancelable(true)
.detail(&detail), .detail(&detail),
) )
.map_err(|err| format!("{err:?}"))?; .map_err(|err| anyhow!("{err:?}"))?;
canvas canvas
.dispatch_event(&event) .dispatch_event(&event)
.map_err(|err| format!("{err:?}"))?; .map_err(|err| anyhow!("{err:?}"))?;
Ok(()) Ok(())
} }
fn try_get_canvas(window: &Window) -> Result<Element, String> { fn try_get_canvas(window: &Window) -> anyhow::Result<Element> {
let canvas_selector = window let canvas_selector = window
.canvas .canvas
.as_ref() .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 let document = window
.document() .document()
.ok_or("window.document() returned None".to_string())?; .ok_or(anyhow!("window.document() returned None"))?;
match document.query_selector(canvas_selector) { match document.query_selector(canvas_selector) {
Ok(Some(canvas)) => Ok(canvas), Ok(Some(canvas)) => Ok(canvas),
Ok(None) => Err(format!( Ok(None) => Err(anyhow!(
"Failed to find element with selector '{canvas_selector}'" "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:?}")),
} }
} }
+1
View File
@@ -4,6 +4,7 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
anyhow = { workspace = true }
bevy = { workspace = true } bevy = { workspace = true }
studio = { path = "../studio" } studio = { path = "../studio" }