Skip to main content

mist_parser/rev_mapper/
mod.rs

1use std::collections::HashSet;
2
3use pest::Parser;
4use pest_derive::Parser;
5
6#[derive(Parser)]
7#[grammar = "./src/rev_mapper/grammar.pest"]
8pub struct MistMapperParser;
9
10#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
11pub struct MistMap(pub usize, pub usize);
12
13#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
14pub struct RustMap(pub usize, pub usize);
15
16pub fn get_mapping(input: &str) -> HashSet<(RustMap, MistMap)> {
17    let mut mapping = HashSet::new();
18
19    let pairs = MistMapperParser::parse(Rule::mapping, input)
20        .unwrap()
21        .next()
22        .unwrap()
23        .into_inner();
24
25    for pair in pairs {
26        if pair.as_rule() == Rule::map {
27            let rs = pair.as_span().start_pos().line_col();
28            let mut inner = pair.into_inner();
29
30            let (line, col) = (
31                inner.next().unwrap().as_str().parse().unwrap(),
32                inner.next().unwrap().as_str().parse().unwrap(),
33            );
34
35            mapping.insert((RustMap(rs.0, rs.1), MistMap(line, col)));
36        }
37    }
38
39    mapping
40}
41
42pub fn find_mapping(
43    mapping: &HashSet<(RustMap, MistMap)>,
44    target: &RustMap,
45) -> Option<(RustMap, MistMap)> {
46    mapping
47        .iter()
48        .copied()
49        .filter(|(rust, _)| rust <= target)
50        .max_by_key(|(rust, _)| *rust)
51}