omg_core/generation/attributes/
create.rs

1use crate::data::map::Map2d;
2use crate::data::name::validate_name;
3use anyhow::Result;
4
5/// Create a new [`Attribute`](crate::data::map::attribute::Attribute) in the [`Map2d`].
6#[derive(Debug, PartialEq, Eq, Clone)]
7pub struct CreateAttributeStep {
8    attribute: String,
9    default: u8,
10}
11
12impl CreateAttributeStep {
13    /// Creates the step, but returns an error if the name is invalid:
14    ///
15    /// ```
16    ///# use omg_core::generation::attributes::create::CreateAttributeStep;
17    /// assert!(CreateAttributeStep::new("", 9).is_err());
18    /// assert!(CreateAttributeStep::new("   ", 42).is_err());
19    /// ```
20    pub fn new<S: Into<String>>(attribute: S, default: u8) -> Result<CreateAttributeStep> {
21        let name = validate_name(attribute)?;
22
23        Ok(CreateAttributeStep {
24            attribute: name,
25            default,
26        })
27    }
28
29    pub fn attribute(&self) -> &str {
30        &self.attribute
31    }
32
33    pub fn default(&self) -> u8 {
34        self.default
35    }
36
37    /// Runs the step.
38    ///
39    /// ```
40    ///# use omg_core::data::map::{get_attribute, Map2d};
41    ///# use omg_core::data::math::size2d::Size2d;
42    ///# use omg_core::generation::attributes::create::CreateAttributeStep;
43    /// let size = Size2d::unchecked(2, 3);
44    /// let mut map = Map2d::new(size);
45    /// let step = CreateAttributeStep::new("test0", 9).unwrap();
46    ///
47    /// step.run(&mut map);
48    ///
49    /// let attribute = get_attribute(&map, 0);
50    /// assert_eq!(attribute.name(), "test0");
51    /// assert_eq!(attribute.size(), &size);
52    /// assert_eq!(attribute.get_all(), &vec![9u8, 9, 9, 9, 9, 9]);
53    /// ```
54    pub fn run(&self, map: &mut Map2d) {
55        info!(
56            "Create attribute '{}' of map '{}'",
57            self.attribute,
58            map.name()
59        );
60
61        map.create_attribute(self.attribute.clone(), self.default)
62            .expect("Failed to create the attribute!");
63    }
64}