type IoResult<'a, T> = nom::IResult<&'a [u8], T>;
use nom::*;
use tuple_utils::Prepend;
use byteorder::WriteBytesExt;
use encoding_rs;
pub enum Endian {
Big,
Little,
}
pub struct Meta {
endian: Endian,
}
#[inline]
fn decode_string(s: &[u8], label: &[u8]) -> std::io::Result<String> {
let enc = encoding_rs::Encoding::for_label_no_replacement(label);
let res = enc.unwrap_or_else(|| panic!("Unknown encoding: {:?}", label))
.decode_without_bom_handling_and_without_replacement(&s);
if let Some(s) = res {
Ok(s.to_string())
} else {
panic!("cannot decode string")
}
}
#[inline]
fn encode_string<W: std::io::Write>(_io: &mut W, s: &str, label: &[u8]) -> std::io::Result<()> {
let enc = encoding_rs::Encoding::for_label_no_replacement(label);
let encoder = enc.unwrap_or_else(|| panic!("Unknown encoding: {:?}", label));
let (bytes, _enc, unmappable) = encoder.encode(s);
assert!(!unmappable);
_io.write_all(&bytes)
}