Expand description

Painless string scanning.

Basically, you’ll want to use this crate if it’s too much pain to solve your problem with a bare chars() iterator. Speaking more broadly, unscanny is useful in these situations:

  • You need to parse simple flat grammars (dates, times, custom stuff, …) and want an interface that’s a bit more convenient to use than a simple char iterator.
  • You’re hand-writing a tokenizer.

The Scanner keeps an internal cursor, allows you to peek around it, advance it beyond chars or other patterns and easily slice substrings before and after the cursor.

Note that the scanner doesn’t have built-in support for parsing things like numbers. It’s a level of abstraction below that and wouldn’t want to mandate a specific number format. However, you can very easily build your required abstractions on top.

Example

Recognizing and parsing a simple comma separated list of floats.

let mut s = Scanner::new(" +12 , -15.3, 14.3  ");
let mut nums = vec![];
while !s.done() {
    s.eat_whitespace();
    let start = s.cursor();
    s.eat_if(['+', '-']);
    s.eat_while(char::is_ascii_digit);
    s.eat_if('.');
    s.eat_while(char::is_ascii_digit);
    nums.push(s.from(start).parse::<f64>().unwrap());
    s.eat_whitespace();
    s.eat_if(',');
}
assert_eq!(nums, [12.0, -15.3, 14.3]);

Structs

A string scanner.

Traits

Something a string can start with.