From a595ed8d9fbe6ff4a7a6f13c279b5412aeb41ab4 Mon Sep 17 00:00:00 2001 From: LawnCable Date: Fri, 15 Apr 2022 08:37:05 +0200 Subject: layer tiles, draft for object parsing and more --- src/lowlevel/mod.rs | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'src/lowlevel/mod.rs') diff --git a/src/lowlevel/mod.rs b/src/lowlevel/mod.rs index 824c693..2eb951e 100644 --- a/src/lowlevel/mod.rs +++ b/src/lowlevel/mod.rs @@ -1,3 +1,9 @@ +use anyhow::{anyhow, bail}; + +use crate::get_attribute; + +use self::tileset::TileSetElement; + pub mod map; pub mod property; @@ -9,7 +15,41 @@ pub mod image; pub mod data; pub mod layer; +pub mod layer_tile; pub(crate) mod macros; -pub mod wangset; \ No newline at end of file +pub mod wangset; + +pub fn parse_map(input: &str) -> anyhow::Result { + let doc = roxmltree::Document::parse(input).unwrap(); + map::Map::from_xml(doc) +} + +pub fn parse_tileset(input: &str) -> anyhow::Result { + let doc = roxmltree::Document::parse(input).unwrap(); + let elem = doc.root_element(); + tileset::TileSet::from_xml(&elem) +} + +pub fn get_tile_set_elements_from_map(input: &str) -> anyhow::Result> { + let doc = roxmltree::Document::parse(input).unwrap(); + let node = doc.root_element(); + let mut tilesets = Vec::new(); + for tileset_node in node.children().filter(|n| n.has_tag_name("tileset")) { + tilesets.push(TileSetElement::from_xml(tileset_node)?); + } + Ok(tilesets) +} + +/// The Tiled version used to save the file (since Tiled 1.0.1). May be a date (for snapshot builds). (optional) +fn parse_tiled_version(node: &roxmltree::Node) -> anyhow::Result> { + if !node.is_root() { + bail!("not a root node") + } + + Ok(match get_attribute!(node, "tiledversion") { + Ok(v) => Some(v.to_owned()), + Err(_) => None, + }) +} -- cgit v1.2.3-60-g2f50