use crate::Position;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(missing_docs)]
pub enum ScannerState {
StreamStart,
StreamEnd,
DocumentStart,
DocumentContent,
BlockMapping,
BlockSequence,
FlowMapping,
FlowSequence,
Scalar,
Tag,
Anchor,
Alias,
}
#[derive(Debug)]
pub struct ScannerContext {
pub state: ScannerState,
pub flow_level: usize,
pub in_key: bool,
pub in_value: bool,
pub allow_simple_key: bool,
pub simple_keys: Vec<Option<Position>>,
}
impl ScannerContext {
pub fn new() -> Self {
Self {
state: ScannerState::StreamStart,
flow_level: 0,
in_key: false,
in_value: false,
allow_simple_key: true,
simple_keys: vec![None],
}
}
pub fn reset(&mut self) {
self.state = ScannerState::StreamStart;
self.flow_level = 0;
self.in_key = false;
self.in_value = false;
self.allow_simple_key = true;
self.simple_keys.clear();
self.simple_keys.push(None);
}
pub fn in_flow(&self) -> bool {
self.flow_level > 0
}
pub fn in_block(&self) -> bool {
self.flow_level == 0
}
pub fn enter_flow(&mut self) {
self.flow_level += 1;
self.simple_keys.push(None);
}
pub fn exit_flow(&mut self) {
if self.flow_level > 0 {
self.flow_level -= 1;
self.simple_keys.pop();
}
}
pub fn save_simple_key(&mut self, position: Position) {
if let Some(key_slot) = self.simple_keys.last_mut() {
*key_slot = Some(position);
}
}
pub fn clear_simple_key(&mut self) {
if let Some(key_slot) = self.simple_keys.last_mut() {
*key_slot = None;
}
}
pub fn simple_key_allowed(&self) -> bool {
self.allow_simple_key && self.simple_keys.last().map_or(false, |k| k.is_none())
}
}
impl Default for ScannerContext {
fn default() -> Self {
Self::new()
}
}