use super::Parser;
use crate::Error;
const KEYWORDS_B: &[&str] = &[
"BU_BO_REL_",
"BU_EV_REL_",
"BU_SG_REL_",
"BA_DEF_DEF_REL_",
"BA_DEF_DEF_",
"BA_DEF_REL_",
"BA_DEF_SGTYPE_",
"BA_SGTYPE_",
"BA_DEF_",
"BO_TX_BU_",
"BA_REL_",
"BA_",
"BS_",
"BU_",
"BO_",
];
const KEYWORDS_S: &[&str] = &[
"SIGTYPE_VALTYPE_",
"SIG_TYPE_REF_",
"SIG_VALTYPE_",
"SG_MUL_VAL_",
"SIG_GROUP_",
"SGTYPE_VAL_",
"SG_",
];
const KEYWORDS_V: &[&str] = &[
"VECTOR__INDEPENDENT_SIG_MSG",
"Vector__XXX",
"VAL_TABLE_",
"VERSION",
"VAL_",
];
const KEYWORDS_C: &[&str] = &["CAT_DEF_", "CAT_", "CM_"];
const KEYWORDS_E: &[&str] = &["ENVVAR_DATA_", "EV_DATA_", "EV_"];
const KEYWORDS_N: &[&str] = &["NS_DESC_", "NS_"];
const KEYWORDS_F: &[&str] = &["FILTER"];
impl<'a> Parser<'a> {
pub fn peek_next_keyword(&mut self) -> crate::Result<&'a str> {
self.skip_newlines_and_spaces();
if self.eof() {
return Err(self.err_unexpected_eof());
}
let first_byte = match self.peek_byte_at(0) {
Some(b) => b,
None => return Err(self.err_unexpected_eof()),
};
let keywords: &[&str] = match first_byte {
b'B' => KEYWORDS_B,
b'S' => KEYWORDS_S,
b'V' => KEYWORDS_V,
b'C' => KEYWORDS_C,
b'E' => KEYWORDS_E,
b'N' => KEYWORDS_N,
b'F' => KEYWORDS_F,
_ => return Err(self.err_expected(Error::EXPECTED_KEYWORD)),
};
for keyword in keywords {
let keyword_bytes = keyword.as_bytes();
if self.starts_with(keyword_bytes) {
let next_byte = self.peek_byte_at(keyword_bytes.len());
let is_valid_delimiter = next_byte
.map(|b| matches!(b, b' ' | b'\t' | b':' | b'\n' | b'\r'))
.unwrap_or(true);
if is_valid_delimiter {
return Ok(keyword);
}
}
}
Err(self.err_expected(Error::EXPECTED_KEYWORD))
}
}