Newer
Older
use std::{collections::HashMap, path::Path};
use xml::attribute::OwnedAttribute;
util::{get_attrs, parse_tag, XmlEventResult},
pub type TileId = u32;
#[derive(Debug, PartialEq, Clone, Default)]
pub image: Option<Image>,
pub collision: Option<ObjectLayerData>,
pub animation: Option<Vec<Frame>>,
pub tile_type: Option<String>,
pub probability: f32,
}
impl Tile {
pub(crate) fn new(
parser: &mut impl Iterator<Item = XmlEventResult>,
) -> Result<(TileId, Tile), TiledError> {
let ((tile_type, probability), id) = get_attrs!(
attrs,
optionals: [
("type", tile_type, |v:String| v.parse().ok()),
("probability", probability, |v:String| v.parse().ok()),
],
required: [
("id", id, |v:String| v.parse::<u32>().ok()),
],
TiledError::MalformedAttributes("tile must have an id with the correct type".to_string())
);
let mut image = Option::None;
let mut properties = HashMap::new();
let mut objectgroup = None;
let mut animation = None;
parse_tag!(parser, "tile", {
"image" => |attrs| {
image = Some(Image::new(parser, attrs, path_relative_to.ok_or(TiledError::SourceRequired{object_to_parse:"Image".to_owned()})?)?);
Ok(())
},
"properties" => |_| {
properties = parse_properties(parser)?;
Ok(())
},
"objectgroup" => |attrs| {
objectgroup = Some(ObjectLayerData::new(parser, attrs, None)?.0);
Ok(())
},
"animation" => |_| {
animation = Some(parse_animation(parser)?);
Ok(())
},
});
Tile {
image,
properties,
collision: objectgroup,
animation,
tile_type,
probability: probability.unwrap_or(1.0),
},
))