use crate::Error;
use crate::Result;
use super::parser::SymbolParser;
use super::types::SymbolFile;
impl SymbolFile {
fn parse(input: &[u8]) -> Result<SymbolFile> {
let mut parser = SymbolParser::new();
let consumed = parser.parse(input)?;
if consumed == 0 {
return Err(Error::with_invalid_input(
"empty SymbolFile (probably something wrong with your debuginfo tooling?)",
))
}
if consumed != input.len() {
return Err(Error::with_invalid_input(
"failed to parse input: parser expects more data",
))
}
let file = parser.finish();
Ok(file)
}
pub(crate) fn from_bytes(bytes: &[u8]) -> Result<SymbolFile> {
Self::parse(bytes)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn test_symbolfile_from_bytes(symbolfile_bytes: &[u8]) {
let sym = SymbolFile::from_bytes(symbolfile_bytes).unwrap();
assert_eq!(sym.files.len(), 1);
assert_eq!(sym.functions.len(), 1);
}
#[test]
fn symbolfile_from_bytes_with_lf() {
test_symbolfile_from_bytes(
b"MODULE Linux x86 ffff0000 bar\nFILE 53 bar.c\nPUBLIC 1234 10 some public\nFUNC 1000 30 10 another func\n1000 30 7 53\n",
);
}
#[test]
fn symbolfile_from_bytes_with_crlf() {
test_symbolfile_from_bytes(
b"MODULE Linux x86 ffff0000 bar\r\nFILE 53 bar.c\r\nPUBLIC 1234 10 some public\r\nFUNC 1000 30 10 another func\r\n1000 30 7 53\r\n",
);
}
}