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
use quire::validate::{Sequence, Numeric, Structure};


#[derive(Deserialize, Serialize, Clone, Copy, Debug)]
pub struct IdMap {
    pub inside: u32,
    pub outside: u32,
    pub count: u32,
}
pub trait IdMapExt {
    fn map_id(&self, internal_id: u32) -> Option<u32>;
}

impl IdMapExt for Vec<IdMap> {
    fn map_id(&self, internal_id: u32) -> Option<u32> {
        if self.len() == 0 {
            return Some(internal_id);
        }
        for rng in self.iter() {
            if internal_id >= rng.inside &&
                internal_id <= rng.inside + rng.count
            {
                return Some(rng.outside + (internal_id - rng.inside));
            }
        }
        None
    }
}

pub fn mapping_validator<'x>() -> Sequence<'x> {
    Sequence::new(
        Structure::new()
        .member("inside", Numeric::new())
        .member("outside", Numeric::new())
        .member("count", Numeric::new()))
}