#[derive(Debug, PartialEq, Clone, Copy)]
pub enum GesType {
GesNode,
GesEle,
GesEdge,
GesFace,
}
impl GesType {
pub fn contains(self, b: &[u8]) -> bool {
use byteorder::{BigEndian, ReadBytesExt};
let len = b.len();
if len < 12
|| (&b[0..8]).read_u64::<BigEndian>().ok() != Some(2314885530818453536)
{
false
} else {
let num = match (&b[8..12]).read_u32::<BigEndian>() {
Ok(n) => n,
Err(_) => return false,
};
match num {
1162626336 | 1196576800 | 1313817632 | 1162102560 | 1297040416 => true,
1330074192 => len >= 13 && &b[12] == &b' ',
1145392206 => {
len >= 15
&& (&b[12..15]).read_u24::<BigEndian>().ok() == Some(5194784)
}
1145392197 => {
if len < 15 {
false
} else {
match (&b[12..15]).read_u24::<BigEndian>().ok() {
Some(4998432) => true,
Some(4998462) => {
len >= 19
&& (&b[15..19]).read_u32::<BigEndian>().ok()
== Some(1313817632)
}
_ => false,
}
}
}
1145392199 => {
if len < 15 {
false
} else {
match (&b[12..15]).read_u24::<BigEndian>().ok() {
Some(5394464) => true,
Some(5394494) => {
len >= 19
&& (&b[15..19]).read_u32::<BigEndian>().ok()
== Some(1313817632)
}
_ => false,
}
}
}
1162757215 => {
len >= 15
&& (&b[12..15]).read_u24::<BigEndian>().ok() == Some(5066564)
}
1162626366 | 1196576830 => {
len >= 16
&& (&b[12..16]).read_u32::<BigEndian>().ok() == Some(1313817632)
}
1145392208 => {
len >= 16
&& (&b[12..16]).read_u32::<BigEndian>().ok() == Some(1095914528)
|| len >= 20
&& (&b[12..20]).read_u64::<BigEndian>().ok()
== Some(4706917187134112800)
}
1346458196 => {
len >= 13 && &b[12] == &b' '
|| len >= 17
&& &b[16] == &b' '
&& (&b[12..16]).read_u32::<BigEndian>().ok() == Some(1045319492)
}
_ => false,
}
}
}
pub fn ended_by(self, b: &[u8]) -> bool {
let len = b.len();
len == 11 && &b[0..11] == b" END"
}
}
#[cfg(test)]
mod tests {
use card::ges::GesType::GesNode;
const LINES: [&'static str; 10] = [
"ab ll",
" aslb",
" NIX",
" ELE ",
" END_MOD",
"ELE",
" END",
" DELGRP>NOD ",
" DELPART 134",
" OGRP 'hausbau'",
];
#[test]
fn test_is_ges() {
let v = vec![
false, false, false, true, true, false, false, true, true, true,
];
assert_eq!(
v,
LINES
.iter()
.map(|l| GesNode.contains(l.as_ref()))
.collect::<Vec<bool>>()
);
}
#[test]
fn test_ends_ges() {
let v = vec![
false, false, false, false, false, false, true, false, false, false,
];
assert_eq!(
v,
LINES
.iter()
.map(|l| GesNode.ended_by(l.as_ref()))
.collect::<Vec<bool>>()
);
}
}