Expand description
An incremental encoder. Note that you must call finish
after you’re done writing.
Writer
supports both combined and outboard encoding, depending on which constructor you use.
Writer
is currently only available when std
is enabled, because std::io::Write
is a
required part of its interface. However, it could be extended to support no_std
-compatible
traits outside of the standard library too. Please reach out to me if you need that.
This implementation is single-threaded.
Example
use std::io::prelude::*;
let mut encoded_incrementally = Vec::new();
let encoded_cursor = std::io::Cursor::new(&mut encoded_incrementally);
let mut encoder = bao::encode::Writer::new(encoded_cursor);
encoder.write_all(b"some input")?;
encoder.finish()?;
Implementations§
source§impl<T: Read + Write + Seek> Writer<T>
impl<T: Read + Write + Seek> Writer<T>
sourcepub fn new(inner: T) -> Self
pub fn new(inner: T) -> Self
Create a new Writer
that will produce a combined encoding.The encoding will contain all
the input bytes, so that it can be decoded without the original input file. This is what
you get from bao encode
.
sourcepub fn new_outboard(inner: T) -> Self
pub fn new_outboard(inner: T) -> Self
Create a new Writer
for making an outboard encoding. That means that the encoding won’t
include any input bytes. Instead, the input will need to be supplied as a separate argument
when the outboard encoding is later decoded. This is what you get from bao encode --outboard
.
sourcepub fn finish(&mut self) -> Result<Hash>
pub fn finish(&mut self) -> Result<Hash>
Finalize the encoding, after all the input has been written. You can’t use this type again
after calling finish
.
The underlying strategy of the Writer
is to first store the tree in a post-order layout,
and then to go back and flip the entire thing into pre-order. That makes it possible to
stream input without knowing its length in advance, which is a core requirement of the
std::io::Write
interface. The downside is that finish
is a relatively expensive step.
Trait Implementations§
source§impl<T: Read + Write + Seek> Write for Writer<T>
impl<T: Read + Write + Seek> Write for Writer<T>
source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector
)1.0.0 · source§fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
write_all_vectored
)