mod context;
mod data;
mod expr;
mod parser;
pub mod prelude;
mod pvec;
mod render;
pub mod samples;
pub use context::Context;
pub use context::Scope;
pub use data::Data;
pub use expr::Expr;
pub use parser::ParseError;
pub use parser::Pattern;
pub use pvec::PatternVec;
pub use render::render;
pub use render::Render;
pub use render::Renderable;
fn err<T, S: Into<String>>(s: S) -> Result<T, ParseError> {
Err(ParseError::Other(s.into()))
}
pub enum Endian {
Little,
Big,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sample() {
let bytes = render((1234u64, 50000u16));
let parser = {
use prelude::*;
all_of((magic_u64(1234), U8, U8))
};
let data = parser.parse(&bytes).unwrap();
assert_eq!(
data,
Data::fseq(vec![Data::Int(1234), Data::Int(80), Data::Int(195),])
);
assert_eq!(50000, (195 << 8) + 80);
}
#[test]
fn alternatives() {
let bytes = render((1234u64, 50000u16));
let parser = {
use prelude::*;
any_of((
all_of((all_of(()).mapval("big-endian"), be_magic_u64(1234), BE_U16)),
all_of((
all_of(()).mapval("little-endian"),
le_magic_u64(1234),
U8,
U8,
)),
))
};
let data = parser.parse(&bytes).unwrap();
assert_eq!(
data,
Data::fseq(vec![
"little-endian".into(),
Data::Int(1234),
Data::Int(80),
Data::Int(195),
])
);
assert_eq!(50000, (195 << 8) + 80);
}
#[test]
fn list() {
let bytes = render((
1234u32, 3u32, (
777u64, 888u64, 999u64, 444u64, 555u64, 666u64, ),
));
enum Key {
LENGTH,
}
let parser = {
use prelude::*;
all_of((
le_magic_u32(1234),
U32.add(1).store(Key::LENGTH as i64),
array_of(LE_U64, getvar(Key::LENGTH as i64)),
))
};
let data = parser.parse(&bytes).unwrap();
assert_eq!(
data,
Data::fseq(vec![
Data::Int(1234), Data::Int(4), Data::fseq(vec![
Data::Int(777),
Data::Int(888),
Data::Int(999),
Data::Int(444),
]),
])
);
let bytes = render((
1234u32, 4u32, (
777u64, 888u64, 999u64, 444u64, 555u64, 666u64, ),
));
let data = parser.parse(&bytes).unwrap();
assert_eq!(
data,
Data::fseq(vec![
Data::Int(1234), Data::Int(5), Data::fseq(vec![
Data::Int(777),
Data::Int(888),
Data::Int(999),
Data::Int(444),
Data::Int(555),
]),
])
);
}
}