use crate::scanner_data::TransitionToNumericMode;
use super::pattern::Pattern;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ScannerMode {
pub name: String,
pub patterns: Vec<Pattern>,
pub transitions: Vec<TransitionToNumericMode>,
}
impl ScannerMode {
pub fn new<P, T>(name: &str, patterns: P, mode_transitions: T) -> Self
where
P: IntoIterator<Item = Pattern>,
T: IntoIterator<Item = TransitionToNumericMode>,
{
let patterns = patterns.into_iter().collect::<Vec<_>>();
let transitions = mode_transitions.into_iter().collect::<Vec<_>>();
debug_assert!(
transitions
.windows(2)
.all(|w| w[0].token_type() < w[1].token_type()),
"Transitions are not sorted by token type number."
);
Self {
name: name.to_string(),
patterns,
transitions,
}
}
}