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 42
use crate::gbparser::*; use pest::iterators::Pair; #[derive(Debug,Clone)] pub enum Range{ BaseRange(usize,usize), Single(usize), Complement(Box<Range>), Join(Vec<Box<Range>>) } impl Range{ pub fn from(range_token:Pair<Rule>)->Range{ for elem in range_token.into_inner(){ match elem.as_rule() { Rule::single=>{ return Range::Single(elem.as_str().parse().unwrap()) } Rule::base_range=>{ let mut insides = elem.into_inner(); let start = insides.next().unwrap().as_str().parse().unwrap(); let end = insides.next().unwrap().as_str().parse().unwrap(); return Range::BaseRange(start,end) } Rule::complement=>{ let mut insides = elem.into_inner(); return Range::Complement(Box::new(Range::from(insides.next().unwrap()))) } Rule::join=>{ let mut res = Vec::new(); let insides = elem.into_inner(); for range in insides{ res.push(Box::new(Range::from(range))) } return Range::Join(res) } _=>unreachable!() } } unreachable!() } }