use std::collections::HashMap;
use crate::{
Result, TileId,
properties::{Color, Properties, parse_properties},
util::{get_attrs, parse_tag},
};
#[derive(Debug, PartialEq, Clone)]
pub struct WangColor {
pub name: String,
pub user_type: String,
#[allow(missing_docs)]
pub color: Color,
pub tile: Option<TileId>,
pub probability: f32,
pub properties: Properties,
}
impl WangColor {
pub(crate) fn new<R: std::io::BufRead>(
elem: crate::util::XmlElement<'_, R>,
) -> Result<WangColor> {
let ((user_type,), (name, color, tile, probability)) = get_attrs!(
for v in (elem.attrs) {
Some("class") => user_type ?= v.parse::<String>(),
"name" => name ?= v.parse::<String>(),
"color" => color ?= v.parse(),
"tile" => tile ?= v.parse::<i64>(),
"probability" => probability ?= v.parse::<f32>(),
}
((user_type,), (name, color, tile, probability))
);
let tile = if tile >= 0 { Some(tile as u32) } else { None };
let mut properties = HashMap::new();
parse_tag!(elem, {
"properties" => |elem| {
properties = parse_properties(elem)?;
Ok(())
},
});
Ok(WangColor {
name,
user_type: user_type.unwrap_or_default(),
color,
tile,
probability,
properties,
})
}
}