52 lines
1.3 KiB
Rust
52 lines
1.3 KiB
Rust
use std::collections::HashSet;
|
|
|
|
use pest::Parser;
|
|
use pest_derive::Parser;
|
|
|
|
#[derive(Parser)]
|
|
#[grammar = "./src/rev_mapper/grammar.pest"]
|
|
pub struct MistMapperParser;
|
|
|
|
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
|
|
pub struct MistMap(pub usize, pub usize);
|
|
|
|
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
|
|
pub struct RustMap(pub usize, pub usize);
|
|
|
|
pub fn get_mapping(input: &str) -> HashSet<(RustMap, MistMap)> {
|
|
let mut mapping = HashSet::new();
|
|
|
|
let pairs = MistMapperParser::parse(Rule::mapping, input)
|
|
.unwrap()
|
|
.next()
|
|
.unwrap()
|
|
.into_inner();
|
|
|
|
for pair in pairs {
|
|
if pair.as_rule() == Rule::map {
|
|
let rs = pair.as_span().start_pos().line_col();
|
|
let mut inner = pair.into_inner();
|
|
|
|
let (line, col) = (
|
|
inner.next().unwrap().as_str().parse().unwrap(),
|
|
inner.next().unwrap().as_str().parse().unwrap(),
|
|
);
|
|
|
|
mapping.insert((RustMap(rs.0, rs.1), MistMap(line, col)));
|
|
}
|
|
}
|
|
|
|
mapping
|
|
}
|
|
|
|
pub fn find_mapping(
|
|
mapping: &HashSet<(RustMap, MistMap)>,
|
|
target: &RustMap,
|
|
) -> Option<(RustMap, MistMap)> {
|
|
mapping
|
|
.iter()
|
|
.copied()
|
|
.filter(|(rust, _)| rust <= target)
|
|
.max_by_key(|(rust, _)| *rust)
|
|
}
|