-
Notifications
You must be signed in to change notification settings - Fork 93
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
take_until_bytes() and partial parsing #327
Comments
These were ignoring the `PartialState` from `take_fn` which would cause them to resume parsing from the start of the "haystack" on every restart. Fixing the type signature will cause them to retain the `usize` state that `take_fn` uses to skip ahead. Fixes #327
Fixed the state issue in #328 but you generally shouldn't call |
Fantastic, thanks for the quick fix! My test case passes the above code and your new 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?The text was updated successfully, but these errors were encountered: