use crate::*; #[derive(Debug, Clone, Default)] pub struct BraceStack { pub braces: Vec, } impl BraceStack { pub fn push( &mut self, brace: char, ) -> CsResult<()> { match brace { '(' | '[' | '{' => self.braces.push(brace), ')' => { if self.braces.pop() != Some('(') { return Err(CsError::UnexpectedClosingBrace(brace)); } } ']' => { if self.braces.pop() != Some('[') { return Err(CsError::UnexpectedClosingBrace(brace)); } } '}' => { if self.braces.pop() != Some('{') { return Err(CsError::UnexpectedClosingBrace(brace)); } } _ => panic!("unexpected brace: {}", brace), } Ok(()) } pub fn depth(&self) -> usize { self.braces.len() } pub fn is_in( &self, brace: char, ) -> bool { self.braces.contains(&brace) } } pub fn char_is_brace(c: char) -> bool { match c { '{' | '}' | '[' | ']' | '(' | ')' => true, _ => false, } }