about summary refs log tree commit diff
path: root/src/entities/environment.rs
blob: 8f8a56706287c7c20b6409cbf896a7a9b2e8bac7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use crate::display;
use crate::display::draw_box::{BoxStyle, Stylable};
use crate::entities::Entity;
use crate::types::{Neighbors, Position};
use std::io::{self, Write};

entity! {
    pub struct Wall {
        pub style: BoxStyle
    }
}

static_description!(Wall, "a wall");

impl Wall {
    pub fn new(position: Position, style: BoxStyle) -> Self {
        new_entity!(Wall { position, style })
    }
}

impl display::DrawWithNeighbors for Wall {
    fn do_draw_with_neighbors<'a, 'b>(
        &'a self,
        out: &'b mut dyn Write,
        neighbors: &'a Neighbors<Vec<&'a Box<dyn Entity>>>,
    ) -> io::Result<()> {
        let neighbor_styles: Neighbors<Option<BoxStyle>> =
            neighbors.map(|es| {
                es.iter()
                    .filter_map(|e| e.downcast_ref::<Wall>())
                    .map(|wall| wall.style)
                    .next()
            });
        write!(out, "{}", neighbor_styles.style(self.style))
    }
}