Closed simpsoneric closed 2 years ago
Fixed the state issue in https://github.com/Marwes/combine/pull/328 but you generally shouldn't call parse_with_state
explicitly, just incorporate the take_until_bytes/range
parser before your other parser and call parse
as normal (let the state be an implementation detail. To drop the output of take_until_bytes
you can just wrap that parser with ignore
or .map(|_| ())
Fantastic, thanks for the quick fix! My test case passes the above code and your new issue_327
branch.
Thanks for the insight on letting the state be an implementation detail wrapped by the internal state. I am struggling figure out what data structure I can use as a test source that approach though. For example:
pub fn parser5() {
let sync = [1u8, 2, 3, 4, 5];
let prefix_data = [9u8, 9];
let mut buf = BytesMut::with_capacity(64);
// Add random prefix data
buf.extend_from_slice(&prefix_data);
// Add partial sync sequence
buf.extend_from_slice(&sync[..sync.len()-1]);
let mut prefix_parser = take_until_range(&sync[..]);
{
// Should be able to drop first items from input stream
let r = prefix_parser.parse(PartialStream(&buf[..])); // <-- `buf` immutable borrow first occurs here
dbg!(r);
}
{
// Add last item from the sync sequence
buf.put_u8(sync[sync.len()-1]); // <-- Error: cannot borrow mutable due to above immutable borrow
let r = prefix_parser.parse(PartialStream(&buf[..]));
dbg!(r);
}
}
If you don't mind giving some advice on how this should be approached, I'd appreciate it. Otherwise, I'll start digging around the code/docs some more.
I'm attempting to write a parser that searches for the start of a sync pattern in a byte stream. If the pattern doesn't exist, I'd like to remove the unmatched prefix from the input.
I initially attempted using the
take_until_bytes()
function, but this function expects aPartialState = ()
. This is shown by the following compile error:Internally, the
take_until_bytes()
function utilizes thetake_fn()
that should return aTakeRange::NotFound( amount to remove)
, but I can't get this to type check.Questions:
take_until_bytes()
support partial parsing?