pub struct Scanner { /* private fields */ }
Expand description
This is used to analyze string. It can be initialized using either
Scanner::from
or Scanner::new
.
§Example
use snob::Scanner;
let mut scanner = Scanner::new("Hello, world!");
if let Some(position) = scanner.starts_with("Hello") {
scanner.goto(position);
}
Implementations§
Source§impl Scanner
impl Scanner
Sourcepub fn new(source: impl AsRef<str>) -> Self
pub fn new(source: impl AsRef<str>) -> Self
Create a new Scanner with a given source.
§Example
use snob::Scanner;
let scanner = Scanner::new("Hello, world!");
Sourcepub fn source(&self) -> &[char]
pub fn source(&self) -> &[char]
Get the full source being used in this scanner, as a slice of characters
§Example
use snob::Scanner;
let scanner = Scanner::new("Hello, world!");
let source = scanner.source().iter().collect::<String>();
assert_eq!(scanner.source().iter().collect::<String>(), "Hello, world!");
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Get the full length of the source being used in this scanner
§Example
use snob::Scanner;
let scanner = Scanner::new("Hello, world!");
assert_eq!(scanner.len(), 13);
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if the scanner’s source is an empty string
§Example
use snob::Scanner;
let scanner = Scanner::new("Hello, world!");
assert!(!scanner.is_empty());
Sourcepub fn char_at(&self, index: usize) -> Option<char>
pub fn char_at(&self, index: usize) -> Option<char>
Get the character at a given position in the string.
§Example
use snob::Scanner;
let scanner = Scanner::new("Hello, world!");
assert!(!scanner.is_empty());
Sourcepub fn position(&self) -> usize
pub fn position(&self) -> usize
Get the current position in the string. When the Scanner
is
created, this value is zero.
§Example
use snob::Scanner;
let mut scanner = Scanner::new("Hello, world!");
assert_eq!(scanner.position(), 0);
scanner.advance(5);
assert_eq!(scanner.position(), 5);
scanner.goto(3);
assert_eq!(scanner.position(), 3);
Sourcepub fn is_at_end(&self) -> bool
pub fn is_at_end(&self) -> bool
Returns true if the scanner’s position has reached the end of its source.
§Example
use snob::Scanner;
let mut scanner = Scanner::new("Hello, world!");
assert!(!scanner.is_at_end());
if let Some(position) = scanner.starts_with("Hello, world!") {
scanner.goto(position);
}
assert!(scanner.is_at_end());
Sourcepub fn goto(&mut self, position: usize) -> Option<String>
pub fn goto(&mut self, position: usize) -> Option<String>
Set the scanner’s position
. If the position out of range out the
source, then None
is returned. Otherwise, the subslice from the old
position to the new position is returned. If the latter is less than
the former, then the string is reversed.
§Example
use snob::Scanner;
let mut scanner = Scanner::new("Hello, world!");
scanner.goto(3);
assert_eq!(scanner.position(), 3);
Sourcepub fn advance(&mut self, amount: isize) -> Option<String>
pub fn advance(&mut self, amount: isize) -> Option<String>
Increase the position by the given amount
. If the new position is out
of the range of the source, then None
is returned. Otherwise, the
subslice from the old position to the new position is returned. If the
latter is less than the former, then the string is reversed.
§Example
use snob::Scanner;
let mut scanner = Scanner::new("Hello, world!");
scanner.advance(5);
assert_eq!(scanner.position(), 5);
Sourcepub fn find_substring(&self, substring: impl AsRef<str>) -> Option<usize>
pub fn find_substring(&self, substring: impl AsRef<str>) -> Option<usize>
Looks for the given substring
in the remainder of the scanner. If the
substring is found, the position of the first character in the
substring is returned. Otherwise, None
is returned.
§Example
use snob::Scanner;
let scanner = Scanner::new("Hello, world!");
let position = scanner.find_substring("lo")?;
assert_eq!(position, 3);
Sourcepub fn starts_with(&self, substring: impl AsRef<str>) -> Option<usize>
pub fn starts_with(&self, substring: impl AsRef<str>) -> Option<usize>
If source[position..]
starts with the given string, then this returns
the ending position of the substring. Otherwise, None
is returned.
§Example
use snob::Scanner;
let scanner = Scanner::new("Hello, world!");
let position = scanner.starts_with("Hello")?;
assert_eq!(position, 5);
Sourcepub fn advance_if_starts_with(
&mut self,
substring: impl AsRef<str>,
) -> Option<String>
pub fn advance_if_starts_with( &mut self, substring: impl AsRef<str>, ) -> Option<String>
If source[position..]
starts with the given string, then this returns
a copy of the substring. Otherwise, None
is returned. This is the
equivalent of: self.goto(self.starts_with(substring)?)
.
§Example
use snob::Scanner;
let mut scanner = Scanner::new("Hello, world!");
let substring = scanner.advance_if_starts_with("Hello")?;
assert_eq!(substring, "Hello");
assert_eq!(scanner.position(), 5);
Sourcepub fn any(&self, cset: impl CharacterSet) -> Option<usize>
pub fn any(&self, cset: impl CharacterSet) -> Option<usize>
If the next character in the scanner is contained in the given cset
,
then the position after the next character is returned. Otherwise,
None
is returned.
§Example
use snob::Scanner;
let scanner = Scanner::new("Hello, world!");
let position = scanner.any('H')?;
assert_eq!(position, 1);
Sourcepub fn many(&self, cset: impl CharacterSet) -> Option<usize>
pub fn many(&self, cset: impl CharacterSet) -> Option<usize>
If the next character in the scanner is contained in the given cset
,
then the position after the longest initial sequence of characters in
cset
is returned. Otherwise, None
is returned.
§Example
use snob::Scanner;
use snob::csets::AsciiLetters;
let scanner = Scanner::new("Hello, world!");
let position = scanner.many(AsciiLetters)?;
assert_eq!(position, 5);
Sourcepub fn upto(&self, cset: impl CharacterSet) -> Option<usize>
pub fn upto(&self, cset: impl CharacterSet) -> Option<usize>
If the remainder of the scanner contains a character from the given
cset
, then the position of the aforementioned character is returned.
Otherwise, None
is returned.
§Example
use snob::Scanner;
let scanner = Scanner::new("Hello, world!");
let position = scanner.upto(' ')?;
assert_eq!(position, 6);