Hi all,
Presently I'm trying to iterate through some Chars
that I have in something like:
use std::iter::{Iterator, Peekable};
use std::str::Chars;
use std::string::String;
fn main() {
let s = String::from("\"hell\\\"o_world\"=>\"value\"");
let mut chars = s.chars()
.skip_while(|c| match *c {
'"' => true,
_ => false,
})
.peekable();
let mut key = String::new();
// let mut value = String::new();
collect_and_unescape(&mut key, &mut chars);
chars = chars.skip_while(|c| match *c {
'"' => false,
_ => true,
}).peekable();
chars.next();
println!("key: {}", key);
}
fn collect_and_unescape<T>(value: &mut String, chars: &mut Peekable<T>)
where
T: Iterator<Item = char>,
{
loop {
let next = chars.next();
let next_char = match next {
Some('\\') => {
match chars.peek() {
Some(&'"') | Some(&'\\') => chars.next(),
_ => None,
}
}
Some('"') | None => break,
_ => next,
};
if let Some(c) = next_char {
value.push(c);
}
}
}
But when I compile it, I get
❯❯❯ rustc test.rs
error[E0308]: mismatched types
--> test.rs:16:13
|
16 | chars = chars.skip_while(|c| match *c {
| _____________^
17 | | '"' => false,
18 | | _ => true,
19 | | }).peekable();
| |_________________^ expected struct `std::str::Chars`, found struct `std::iter::Peekable`
|
= note: expected type `std::iter::Peekable<std::iter::SkipWhile<std::str::Chars<'_>, [closure@test.rs:8:21: 11:10]>>`
found type `std::iter::Peekable<std::iter::SkipWhile<std::iter::Peekable<std::iter::SkipWhile<std::str::Chars<'_>, [closure@test.rs:8:21: 11:10]>>, [closure@test.rs:16:30: 19:6]>>`
error: aborting due to previous error(s)
And I'm not entirely certain how to work past it. Perhaps I'm misunderstanding how skip_while
and peekable
work? Any help would be appreciated.
Thanks in advance !