Crates.io | flexible-io |
lib.rs | flexible-io |
version | 0.4.0 |
source | src |
created_at | 2023-11-16 21:12:46.010496 |
updated_at | 2024-10-19 14:39:00.734804 |
description | Wraps values such that dyn-safe IO traits need not appear as static bounds |
homepage | |
repository | https://github.com/HeroicKatora/not-io |
max_upload_size | |
id | 1037999 |
size | 50,701 |
Packs a reader or writer with its io-trait implementations, allowing the omission of the traits in the static trait bounds.
The motivation of this is enabling APIs in which use of a reader (or writer) can be optimized in case of it being buffered, but it's not required for correct functioning. Or, an API where the Seek requirement is only determined at runtime, such as when a portion of the functionality does not depend on it, and an error should be returned.
The crate implements, as a proof of concept, a reader which can optionally
Seek
or BufRead
; and a writer which can optionally Seek
. Its up to a
caller to provide the traits by calling setter methods, in a local scope
where the traits are statically shown to be implemented.
use flexible_io::Reader;
fn read_from<R>(reader: Reader<R>) {
if let Some(seekable) = file.as_seek_mut() {
with_seek_strategy(reader);
} else {
with_read_strategy(reader);
}
}
Due to lifetime issues, it is not possible to preserve the knowledge of a trait
being implemented. That is, each conversion from Reader
to a concrete value
of either type &mut dyn {Read,BufRead,Seek}
mutably borrows the whole reader.
Therefore you can't have to such references at the same time. As a workaround,
unwrap the Option
returned from as_*
methods where appropriate.