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"
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",
+3
View File
@@ -6,6 +6,9 @@ members = [
"./studio_cli",
]
[workspace.dependencies]
anyhow = "1.0.75"
[workspace.dependencies.bevy]
version = "0.11.3"
features = ["tonemapping_luts"]
+1
View File
@@ -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"
+1 -1
View File
@@ -146,7 +146,7 @@ declare global {
pub(super) fn notify_entity_selection_change(
r_selection: Option<Res<Selection>>,
q_window: Query<&Window, With<PrimaryWindow>>,
) -> Result<(), String> {
) -> anyhow::Result<()> {
let entity = r_selection.map(|selection| **selection);
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()
}
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::<Entity, With<Inspectable>>()
@@ -60,16 +60,15 @@ pub(super) fn save_scene_system(world: &mut World) -> Result<(), String> {
let scene = builder.build();
let type_registry = world.resource::<AppTypeRegistry>();
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<PrimaryWindow>>()
.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();
+11 -10
View File
@@ -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<JsValue, String>;
fn as_js(&self) -> anyhow::Result<JsValue>;
}
pub trait AsJson {
@@ -87,10 +88,10 @@ impl<T> AsJsValue for T
where
T: AsJson,
{
fn as_js(&self) -> Result<JsValue, String> {
fn as_js(&self) -> anyhow::Result<JsValue> {
self.as_json()
.serialize(&SERIALIZER)
.map_err(|err| format!("{err}"))
.map_err(|err| anyhow!("{err}"))
}
}
@@ -98,25 +99,25 @@ impl<T> AsJsValue for Vec<T>
where
T: Serialize,
{
fn as_js(&self) -> Result<JsValue, String> {
self.serialize(&SERIALIZER).map_err(|err| format!("{err}"))
fn as_js(&self) -> anyhow::Result<JsValue> {
self.serialize(&SERIALIZER).map_err(|err| anyhow!("{err}"))
}
}
impl AsJsValue for JsonValue {
fn as_js(&self) -> Result<JsValue, String> {
self.serialize(&SERIALIZER).map_err(|err| format!("{err}"))
fn as_js(&self) -> anyhow::Result<JsValue> {
self.serialize(&SERIALIZER).map_err(|err| anyhow!("{err}"))
}
}
impl AsJsValue for Entity {
fn as_js(&self) -> Result<JsValue, String> {
fn as_js(&self) -> anyhow::Result<JsValue> {
Ok(JsValue::from_str(&format!("{self:?}")))
}
}
impl AsJsValue for String {
fn as_js(&self) -> Result<JsValue, String> {
fn as_js(&self) -> anyhow::Result<JsValue> {
Ok(JsValue::from_str(self))
}
}
@@ -125,7 +126,7 @@ impl<T> AsJsValue for Option<T>
where
T: AsJsValue,
{
fn as_js(&self) -> Result<JsValue, String> {
fn as_js(&self) -> anyhow::Result<JsValue> {
match self.as_ref() {
Some(value) => Ok(value.as_js()?),
None => Ok(JsValue::NULL),
+10 -9
View File
@@ -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<Element, String> {
fn try_get_canvas(window: &Window) -> anyhow::Result<Element> {
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:?}")),
}
}
+1
View File
@@ -4,6 +4,7 @@ version = "0.1.0"
edition = "2021"
[dependencies]
anyhow = { workspace = true }
bevy = { workspace = true }
studio = { path = "../studio" }