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
37
38
39
40
41
use grid::{Grid, Pt};
use text::Text;

pub fn find_text(grid: &Grid, pt: Pt) -> Option<Text> {
    let mut tf = FindText::new(grid);
    tf.find_text(pt)
}

struct FindText<'a> {
    grid: &'a Grid,
}

impl<'a> FindText<'a> {
    pub fn new(grid: &Grid) -> FindText {
        FindText { grid: grid }
    }

    pub fn find_text(&mut self, start: Pt) -> Option<Text> {
        use grid::Elem::{Clear, Pad, Used, C};
        let grid = self.grid;
        assert!(grid.holds(start));
        let elem = grid[start];
        let mut c = match elem {
            Clear | Pad | Used(..) | C(' ') => return None,
            C(c) => c,
        };
        let grid = self.grid;
        let mut buf = String::new();
        let mut curr = start;
        loop {
            buf.push(c);
            curr = curr.e();
            if !grid.holds(curr) { return Some(Text::new(start, buf)); }
            let elem = grid[curr];
            c = match elem {
                Clear | Pad | Used(..) => return Some(Text::new(start, buf)),
                C(c) => c,
            };
        }
    }
}