Use case
Following situation:
I want to read and parse some input, but it's not so large scale parsing task, so I'd like to avoid adding a heavyweight crate like nom or nom8 to my dependencies
...
use byte_reader::Reader;
fn main() {
let sample_input = "Hello, byte_reader!".as_bytes();
let mut r = Reader::new(sample_input);
r.consume("Hello").unwrap();
r.consume(",").unwrap();
r.skip_whitespace();
let name = r.read_snake().unwrap(); r.consume("!").unwrap();
println!("Greeted to `{name}`.");
}
Operations
advance_by
next
, next_if
peek
, peek2
, peek3
consume
, consume_oneof
skip_while
, skip_whitespace
read_while
read_uint
, read_int
read_string
, read_string_unchecked
read_camel
, read_snake
, read_kebab
And, with location
feature, you can track the reader's parsing location ( line and column ) in the input bytes :
use byte_reader::Reader;
fn main() {
let sample_input = "Hello, byte_reader!".as_bytes();
let mut r = Reader::new(sample_input);
r.consume("Hello").unwrap();
r.consume(",").unwrap();
r.skip_whitespace();
let name_line = r.line(); let name_column = r.column(); let name = r.read_snake().unwrap(); r.consume("!").unwrap();
println!("Greeted to `{name}`.");
println!("In the input, the name starts at column {name_column} of line {name_line}");
}