Skip to content
Snippets Groups Projects
  • Alejandro Perea's avatar
    Simplify internals (#153) · e8113244
    Alejandro Perea authored
    * Move `parse_animation` to the `animation` module
    
    * Simplify `parse_data_line`
    
    * Simplify tile layer utils
    
    * Simplify `convert_to_tiles`
    
    * Simplify objects module
    
    * Simplify if
    
    * Address PR comments
    Unverified
    e8113244
animation.rs 1.10 KiB
use xml::attribute::OwnedAttribute;

use crate::{error::TiledError, util::{get_attrs, XmlEventResult, parse_tag}};

#[derive(Debug, PartialEq, Clone)]
pub struct Frame {
    pub tile_id: u32,
    pub duration: u32,
}

impl Frame {
    pub(crate) fn new(attrs: Vec<OwnedAttribute>) -> Result<Frame, TiledError> {
        let ((), (tile_id, duration)) = get_attrs!(
            attrs,
            optionals: [],
            required: [
                ("tileid", tile_id, |v:String| v.parse().ok()),
                ("duration", duration, |v:String| v.parse().ok()),
            ],
            TiledError::MalformedAttributes("A frame must have tileid and duration".to_string())
        );
        Ok(Frame {
            tile_id: tile_id,
            duration: duration,
        })
    }
}


pub(crate) fn parse_animation(
    parser: &mut impl Iterator<Item = XmlEventResult>,
) -> Result<Vec<Frame>, TiledError> {
    let mut animation = Vec::new();
    parse_tag!(parser, "animation", {
        "frame" => |attrs| {
            animation.push(Frame::new(attrs)?);
            Ok(())
        },
    });
    Ok(animation)
}