mist_parser/rev_mapper/
mod.rs1use 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}