Vendor things
This commit is contained in:
parent
5deceec006
commit
977e3c17e5
19434 changed files with 10682014 additions and 0 deletions
77
third-party/vendor/winnow/examples/iterator.rs
vendored
Normal file
77
third-party/vendor/winnow/examples/iterator.rs
vendored
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
use std::collections::HashMap;
|
||||
use std::iter::Iterator;
|
||||
|
||||
use winnow::ascii::alphanumeric1;
|
||||
use winnow::combinator::iterator;
|
||||
use winnow::combinator::{separated_pair, terminated};
|
||||
use winnow::prelude::*;
|
||||
|
||||
fn main() {
|
||||
let mut data = "abcabcabcabc";
|
||||
|
||||
fn parser<'s>(i: &mut &'s str) -> PResult<&'s str> {
|
||||
"abc".parse_next(i)
|
||||
}
|
||||
|
||||
// `from_fn` (available from Rust 1.34) can create an iterator
|
||||
// from a closure
|
||||
let it = std::iter::from_fn(move || {
|
||||
match parser.parse_next(&mut data) {
|
||||
// when successful, a parser returns a tuple of
|
||||
// the remaining input and the output value.
|
||||
// So we replace the captured input data with the
|
||||
// remaining input, to be parsed on the next call
|
||||
Ok(o) => Some(o),
|
||||
_ => None,
|
||||
}
|
||||
});
|
||||
|
||||
for value in it {
|
||||
println!("parser returned: {}", value);
|
||||
}
|
||||
|
||||
println!("\n********************\n");
|
||||
|
||||
let mut data = "abcabcabcabc";
|
||||
|
||||
// if `from_fn` is not available, it is possible to fold
|
||||
// over an iterator of functions
|
||||
let res = std::iter::repeat(parser)
|
||||
.take(3)
|
||||
.try_fold(Vec::new(), |mut acc, mut parser| {
|
||||
parser.parse_next(&mut data).map(|o| {
|
||||
acc.push(o);
|
||||
acc
|
||||
})
|
||||
});
|
||||
|
||||
// will print "parser iterator returned: Ok(("abc", ["abc", "abc", "abc"]))"
|
||||
println!("\nparser iterator returned: {:?}", res);
|
||||
|
||||
println!("\n********************\n");
|
||||
|
||||
let data = "key1:value1,key2:value2,key3:value3,;";
|
||||
|
||||
// `winnow::combinator::iterator` will return an iterator
|
||||
// producing the parsed values. Compared to the previous
|
||||
// solutions:
|
||||
// - we can work with a normal iterator like `from_fn`
|
||||
// - we can get the remaining input afterwards, like with the `try_fold` trick
|
||||
let mut winnow_it = iterator(
|
||||
data,
|
||||
terminated(separated_pair(alphanumeric1, ":", alphanumeric1), ","),
|
||||
);
|
||||
|
||||
let res = winnow_it
|
||||
.map(|(k, v)| (k.to_uppercase(), v))
|
||||
.collect::<HashMap<_, _>>();
|
||||
|
||||
let parser_result: PResult<(_, _), ()> = winnow_it.finish();
|
||||
let (remaining_input, ()) = parser_result.unwrap();
|
||||
|
||||
// will print "iterator returned {"key1": "value1", "key3": "value3", "key2": "value2"}, remaining input is ';'"
|
||||
println!(
|
||||
"iterator returned {:?}, remaining input is '{}'",
|
||||
res, remaining_input
|
||||
);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue