add cursor helper
This commit is contained in:
parent
02f34832d9
commit
c71d4081a7
1 changed files with 90 additions and 0 deletions
90
src/lex/cursor.rs
Normal file
90
src/lex/cursor.rs
Normal file
|
@ -0,0 +1,90 @@
|
|||
// See the end of this file for copyright and license terms.
|
||||
|
||||
use std::str::Chars;
|
||||
|
||||
pub(crate) struct Cursor<'a> {
|
||||
stream: Chars<'a>,
|
||||
line: usize,
|
||||
col: usize,
|
||||
}
|
||||
|
||||
impl<'a> Cursor<'a> {
|
||||
pub const fn new(stream: Chars<'a>) -> Cursor<'a> {
|
||||
Cursor {
|
||||
stream: stream,
|
||||
line: 1,
|
||||
col: 1,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn next(&mut self) -> Option<char> {
|
||||
let c = self.stream.next();
|
||||
|
||||
self.col += 1;
|
||||
if c == Some('\n') {
|
||||
self.line += 1;
|
||||
self.col = 0;
|
||||
}
|
||||
|
||||
c
|
||||
}
|
||||
|
||||
pub fn advance_by(&mut self, n: usize) -> Result<(), usize> {
|
||||
for i in 0..n {
|
||||
if self.next() == None {
|
||||
return Err(i)
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn next_until(&mut self, test: fn (c: char) -> bool) -> String {
|
||||
let mut s = String::new();
|
||||
|
||||
for _ in 0.. {
|
||||
match self.peek() {
|
||||
Some(c) => if test(c) {
|
||||
break;
|
||||
} else {
|
||||
s.push(c);
|
||||
self.next();
|
||||
},
|
||||
None => break,
|
||||
}
|
||||
}
|
||||
|
||||
s
|
||||
}
|
||||
|
||||
pub fn peek(&self) -> Option<char> {
|
||||
self.nth(1)
|
||||
}
|
||||
|
||||
pub fn nth(&self, n: usize) -> Option<char> {
|
||||
self.chars().nth(n)
|
||||
}
|
||||
|
||||
pub fn line(&self) -> usize {
|
||||
self.line
|
||||
}
|
||||
|
||||
pub fn col(&self) -> usize {
|
||||
self.col
|
||||
}
|
||||
|
||||
pub fn chars(&self) -> Chars<'a> {
|
||||
self.stream.clone()
|
||||
}
|
||||
}
|
||||
|
||||
// Copyright (C) 2021 Fefie <owo@fef.moe>
|
||||
// This file is part of gayconf.
|
||||
//
|
||||
// gayconf is ethical software: you can use, redistribute,
|
||||
// and/or modify it under the terms of the CNPLv5+ as found
|
||||
// in the LICENSE file in the source code root directory or
|
||||
// at <https://git.pixie.town/thufie/CNPL>.
|
||||
//
|
||||
// gayconf comes with ABSOLUTELY NO WARRANTY, to the extent
|
||||
// permitted by applicable law. See the CNPL for details.
|
Loading…
Reference in a new issue