diff options
Diffstat (limited to 'src/repl/validator.rs')
| -rw-r--r-- | src/repl/validator.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/repl/validator.rs b/src/repl/validator.rs new file mode 100644 index 0000000..e1f6e99 --- /dev/null +++ b/src/repl/validator.rs @@ -0,0 +1,59 @@ +use reedline::{ValidationResult, Validator}; + +/// A default validator which checks for mismatched quotes and brackets +pub struct ReplValidator; + +impl Validator for ReplValidator { + fn validate(&self, line: &str) -> ValidationResult { + if incomplete_brackets(line) { + ValidationResult::Incomplete + } else { + ValidationResult::Complete + } + } +} + +fn incomplete_brackets(line: &str) -> bool { + let mut balance: Vec<char> = Vec::new(); + let mut symbol = None; + for c in line.chars() { + match symbol { + Some(s) => match (s, c) { + ('{', '}') | ('(', ')') => { + balance.pop(); + } + _ if s == c => { + balance.push(c); + } + _ => {} + }, + None => match c { + '{' | '(' => { + balance.push(c); + symbol = Some(c) + } + _ => {} + }, + } + } + + !balance.is_empty() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_incomplete_brackets() { + assert!(incomplete_brackets("{")); + assert!(incomplete_brackets("(")); + assert!(!incomplete_brackets("{}")); + assert!(!incomplete_brackets("()")); + assert!(!incomplete_brackets("{ab\nc}")); + assert!(!incomplete_brackets("(ab\nc)")); + assert!(!incomplete_brackets("{[}")); + assert!(!incomplete_brackets("{{{{{}}}}}")); + assert!(incomplete_brackets("{{}")); + } +} |
