Struct postcard::CobsAccumulator [−][src]
pub struct CobsAccumulator<const N: usize> { /* fields omitted */ }
Expand description
An accumulator used to collect chunked COBS data and deserialize it.
This is often useful when you receive “parts” of the message at a time, for example when draining a serial port buffer that may not contain an entire uninterrupted message.
Examples
Deserialize a struct by reading chunks from a Read
er.
use postcard::{CobsAccumulator, FeedResult};
use serde::Deserialize;
use std::io::Read;
let input = /* Anything that implements the `Read` trait */
let mut raw_buf = [0u8; 32];
let mut cobs_buf: CobsAccumulator<256> = CobsAccumulator::new();
while let Ok(ct) = input.read(&mut raw_buf) {
// Finished reading input
if ct == 0 {
break;
}
let buf = &raw_buf[..ct];
let mut window = &buf[..];
'cobs: while !window.is_empty() {
window = match cobs_buf.feed::<MyData>(&window) {
FeedResult::Consumed => break 'cobs,
FeedResult::OverFull(new_wind) => new_wind,
FeedResult::DeserError(new_wind) => new_wind,
FeedResult::Success { data, remaining } => {
// Do something with `data: MyData` here.
dbg!(data);
remaining
}
};
}
}
Implementations
pub fn feed<'a, T>(&mut self, input: &'a [u8]) -> FeedResult<'a, T> where
T: for<'de> Deserialize<'de>,
pub fn feed<'a, T>(&mut self, input: &'a [u8]) -> FeedResult<'a, T> where
T: for<'de> Deserialize<'de>,
Appends data to the internal buffer and attempts to deserialize the accumulated data into
T
.