Skip to content

Commit 07e3d1b

Browse files
committed
Make YoleckEntityRef::resolve failable
1 parent f26701e commit 07e3d1b

File tree

5 files changed

+35
-20
lines changed

5 files changed

+35
-20
lines changed

assets/levels2d/example.yol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"format_version":2,"app_format_version":1},{},[[{"type":"FloatingText","name":""},{"LaserPointer":{"target":null},"TextContent":{"text":"Collect the fruit"},"Vpeol2dPosition":[118.0838623046875,306.9156494140625],"Vpeol2dScale":[1.0,1.0]}],[{"type":"FloatingText","name":""},{"LaserPointer":{"target":"e8f8d516-ca5f-41d2-99a6-1be029fdd0ee"},"TextContent":{"text":"Orange"},"Vpeol2dPosition":[74.51683044433594,-226.31687927246094],"Vpeol2dScale":[0.75,0.75]}],[{"type":"Triangle","name":""},{"TriangleVertices":{"vertices":[[-12.283805847167969,-141.28375244140625],[211.94580078125,-151.37274169921875],[199.81985473632812,16.863494873046875]]},"Vpeol2dPosition":[-459.87017822265625,-29.312294006347656]}],[{"type":"Player","name":""},{"Vpeol2dPosition":[-309.3874206542969,81.44441223144531],"Vpeol2dRotatation":0.0}],[{"type":"Fruit","name":"","uuid":"eb26f293-7548-4bcc-a268-871c80726fd3"},{"FruitType":{"index":2},"Vpeol2dPosition":[-264.37799072265625,-226.1751708984375]}],[{"type":"Fruit","name":"","uuid":"e8f8d516-ca5f-41d2-99a6-1be029fdd0ee"},{"FruitType":{"index":1},"Vpeol2dPosition":[-3.697650909423828,-60.341732025146484]}],[{"type":"FloatingText","name":""},{"LaserPointer":{"target":"eb26f293-7548-4bcc-a268-871c80726fd3"},"TextContent":{"text":"Grapes"},"Vpeol2dPosition":[-440.10369873046875,-230.0904998779297],"Vpeol2dScale":[0.75,0.75]}]]]
1+
[{"format_version":2,"app_format_version":1},{},[[{"type":"Player","name":""},{"Vpeol2dPosition":[-309.3874206542969,81.44441223144531],"Vpeol2dRotatation":0.0}],[{"type":"Triangle","name":""},{"TriangleVertices":{"vertices":[[-12.283805847167969,-141.28375244140625],[211.94580078125,-151.37274169921875],[199.81985473632812,16.863494873046875]]},"Vpeol2dPosition":[-459.87017822265625,-29.312294006347656]}],[{"type":"FloatingText","name":"","uuid":"8acaa597-8c7d-4b82-8fd5-4eda44e24b5f"},{"TextContent":{"text":"Collect the fruit"},"TextLaserPointer":{"target":{}},"Vpeol2dPosition":[118.0838623046875,306.9156494140625],"Vpeol2dScale":[1.0,1.0]}],[{"type":"FloatingText","name":"","uuid":"14195c3b-e420-4fa4-bc59-7149a7c7f5d4"},{"TextContent":{"text":"Orange"},"TextLaserPointer":{"target":{"uuid":"e8f8d516-ca5f-41d2-99a6-1be029fdd0ee"}},"Vpeol2dPosition":[74.51683044433594,-226.31687927246094],"Vpeol2dScale":[0.75,0.75]}],[{"type":"Fruit","name":"","uuid":"e8f8d516-ca5f-41d2-99a6-1be029fdd0ee"},{"FruitType":{"index":1},"Vpeol2dPosition":[-3.697650909423828,-60.341732025146484]}],[{"type":"Fruit","name":"","uuid":"eb26f293-7548-4bcc-a268-871c80726fd3"},{"FruitType":{"index":2},"Vpeol2dPosition":[-265.73712158203125,-226.1751708984375]}],[{"type":"FloatingText","name":"","uuid":"e9f7c89f-f975-41e0-9ab0-30991e715877"},{"TextContent":{"text":"Grapes"},"TextLaserPointer":{"target":{"uuid":"eb26f293-7548-4bcc-a268-871c80726fd3"}},"Vpeol2dPosition":[-440.10369873046875,-230.0904998779297],"Vpeol2dScale":[0.75,0.75]}]]]

examples/example2d.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ fn resolve_laser_pointers(
583583
uuid_registry: Res<YoleckUuidRegistry>,
584584
) {
585585
for mut laser_pointer in query.iter_mut() {
586-
laser_pointer.target.resolve(&uuid_registry);
586+
let _ = laser_pointer.target.resolve(&uuid_registry);
587587
}
588588
}
589589

@@ -593,14 +593,14 @@ fn draw_laser_pointers(
593593
mut gizmos: Gizmos,
594594
) {
595595
for (laser_pointer, source_transform) in query.iter() {
596-
if let Some(target_entity) = laser_pointer.target.entity() {
597-
if let Ok(target_transform) = targets_query.get(target_entity) {
598-
gizmos.line(
599-
source_transform.translation(),
600-
target_transform.translation(),
601-
css::GREEN,
602-
);
603-
}
596+
if let Some(target_entity) = laser_pointer.target.entity()
597+
&& let Ok(target_transform) = targets_query.get(target_entity)
598+
{
599+
gizmos.line(
600+
source_transform.translation(),
601+
target_transform.translation(),
602+
css::GREEN,
603+
);
604604
}
605605
}
606606
}

examples/example3d.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ fn resolve_laser_pointers(
283283
uuid_registry: Res<YoleckUuidRegistry>,
284284
) {
285285
for mut laser_pointer in query.iter_mut() {
286-
laser_pointer.target.resolve(&uuid_registry);
286+
let _ = laser_pointer.target.resolve(&uuid_registry);
287287
}
288288
}
289289

@@ -293,14 +293,14 @@ fn draw_laser_pointers(
293293
mut gizmos: Gizmos,
294294
) {
295295
for (laser_pointer, source_transform) in query.iter() {
296-
if let Some(target_entity) = laser_pointer.target.entity() {
297-
if let Ok(target_transform) = targets_query.get(target_entity) {
298-
gizmos.line(
299-
source_transform.translation(),
300-
target_transform.translation(),
301-
css::LIMEGREEN,
302-
);
303-
}
296+
if let Some(target_entity) = laser_pointer.target.entity()
297+
&& let Ok(target_transform) = targets_query.get(target_entity)
298+
{
299+
gizmos.line(
300+
source_transform.translation(),
301+
target_transform.translation(),
302+
css::LIMEGREEN,
303+
);
304304
}
305305
}
306306
}

src/entity_ref.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize};
33
use uuid::Uuid;
44

55
use crate::entity_uuid::YoleckUuidRegistry;
6+
use crate::errors::YoleckEntityRefCannotBeResolved;
67

78
/// A reference to another Yoleck entity, stored by UUID for persistence.
89
///
@@ -98,12 +99,19 @@ impl YoleckEntityRef {
9899
self.resolved = None;
99100
}
100101

101-
pub fn resolve(&mut self, registry: &YoleckUuidRegistry) {
102+
pub fn resolve(
103+
&mut self,
104+
registry: &YoleckUuidRegistry,
105+
) -> Result<(), YoleckEntityRefCannotBeResolved> {
102106
if let Some(uuid) = self.uuid {
103107
self.resolved = registry.get(uuid);
108+
if self.resolved.is_none() {
109+
return Err(YoleckEntityRefCannotBeResolved { uuid });
110+
}
104111
} else {
105112
self.resolved = None;
106113
}
114+
Ok(())
107115
}
108116
}
109117

src/errors.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use bevy::ecs::error::BevyError;
2+
use uuid::Uuid;
23

34
#[derive(thiserror::Error, Debug)]
45
pub(crate) enum YoleckAssetLoaderError {
@@ -18,3 +19,9 @@ impl From<BevyError> for YoleckAssetLoaderError {
1819
Self::Bevy(value)
1920
}
2021
}
22+
23+
#[derive(thiserror::Error, Debug)]
24+
#[error("{uuid} does not resolve to any known entity in the registry")]
25+
pub struct YoleckEntityRefCannotBeResolved {
26+
pub uuid: Uuid,
27+
}

0 commit comments

Comments
 (0)