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}