From 2f6d637ff4318cab086f53a94c77d95e760492b3 Mon Sep 17 00:00:00 2001
From: SiegeLord <slabode@aim.com>
Date: Mon, 27 Dec 2021 16:00:23 -0800
Subject: [PATCH] Support object properties.

Fixes #72
---
 assets/tiled_object_property.tmx | 21 +++++++++++++++++++++
 src/properties.rs                |  6 ++++++
 tests/lib.rs                     | 13 +++++++++++++
 3 files changed, 40 insertions(+)
 create mode 100644 assets/tiled_object_property.tmx

diff --git a/assets/tiled_object_property.tmx b/assets/tiled_object_property.tmx
new file mode 100644
index 0000000..36f387e
--- /dev/null
+++ b/assets/tiled_object_property.tmx
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.5" tiledversion="1.7.2" orientation="orthogonal" renderorder="right-down" width="2" height="2" tilewidth="32" tileheight="32" infinite="0" nextlayerid="3" nextobjectid="4">
+ <layer id="1" name="Tile Layer 1" width="2" height="2">
+  <data encoding="csv">
+0,0,
+0,0
+</data>
+ </layer>
+ <objectgroup id="2" name="Object Layer 1">
+  <object id="2" x="0" y="0" width="32" height="32">
+   <properties>
+    <property name="object property" type="object" value="3"/>
+   </properties>
+  </object>
+  <object id="3" x="32" y="32" width="32" height="32">
+   <properties>
+    <property name="object property" type="object" value="0"/>
+   </properties>
+  </object>
+ </objectgroup>
+</map>
diff --git a/src/properties.rs b/src/properties.rs
index dfc2976..68afa62 100644
--- a/src/properties.rs
+++ b/src/properties.rs
@@ -45,6 +45,8 @@ pub enum PropertyValue {
     StringValue(String),
     /// Holds the path relative to the map or tileset
     FileValue(String),
+    /// Holds the id of a referenced object, or 0 if unset
+    ObjectValue(u32),
 }
 
 impl PropertyValue {
@@ -70,6 +72,10 @@ impl PropertyValue {
                 ))),
             },
             "string" => Ok(PropertyValue::StringValue(value)),
+            "object" => match value.parse() {
+                Ok(val) => Ok(PropertyValue::ObjectValue(val)),
+                Err(err) => Err(TiledError::Other(err.to_string())),
+            },
             "file" => Ok(PropertyValue::FileValue(value)),
             _ => Err(TiledError::Other(format!(
                 "Unknown property type \"{}\"",
diff --git a/tests/lib.rs b/tests/lib.rs
index e816ad6..c46a54e 100644
--- a/tests/lib.rs
+++ b/tests/lib.rs
@@ -190,3 +190,16 @@ fn test_ldk_export() {
         assert!(false, "It is wrongly recognised as an infinite map");
     }
 }
+
+#[test]
+fn test_object_property() {
+    let r = read_from_file(&Path::new("assets/tiled_object_property.tmx")).unwrap();
+    let prop_value = if let Some(PropertyValue::ObjectValue(v)) =
+        r.object_groups[0].objects[0].properties.get("object property")
+    {
+        *v
+    } else {
+        0
+    };
+    assert_eq!(3, prop_value);
+}
-- 
GitLab