Description
- Character: Barbara (almost)
- Brief summary: Barbara tries to write a library that parses a particular kind of format in a streaming fashion that works with any implementation of
std::io::Read
orstd::io::Write
, and wants it to work in an async context with minimal fuss. - Key points or morals (if known):
- Library author may not know much (or anything) about Async Rust.
- There is nothing inherently "sync" or "async" about the actual details of the format. By virtue of working on things like the
Read
/Write
traits, it works on streams. (Where "stream" is used colloquially here.) - Depending on specific async runtimes with specific async versions of the
Read
/Write
traits seems inelegant and doesn't seem to scale with respect to maintenance effort. - Async Runtimes may have adapters for working with
Read
/Write
impls, but it may come with additional costs that one might not want to pay. - Making such code work regardless of if it's used in a sync or async context should not require major effort or significant code duplication.
One example here is the flate2
crate. To solve this problem, they have an optional dependency on a specific async runtime, tokio, and have impls for AsyncRead
and AsyncWrite
that are specific to async runtime.
Another example is the csv
crate. The problem has come up a few times:
- Async csv read stream using csv-core and tokio BurntSushi/rust-csv#141
- Suggestion: Readers/Writers that work with AsyncRead/AsyncWrite BurntSushi/rust-csv#171
- Added async implementation of CSV reader BurntSushi/rust-csv#199
Its author (me) has not wanted to wade into these waters because of the aforementioned problems. As a result, folks are maintaining a csv-async
fork to make it work in an async context. This doesn't seem ideal.
This is somewhat related to #45. For example, AsyncRead
/AsyncWrite
traits that are shared across all async runtimes might do a lot to fix this problem. But I'm not sure. Fundamentally, this, to me, is about writing I/O adapters that don't care about whether they're used in a sync or async context with minimal fuss, rather than just about trying to abstract over all async runtimes.
Apologies in advance if I've filled out this issue incorrectly. I tried to follow the others, but maybe I got a bit too specific! Happy to update it as appropriate. Overall, I think this is a really wonderful approach to gather feedback. I'm completely blown away by this!
Also, above, I said this was "almost" Barabara, because this story doesn't actually require the programmer to write or even care about async code at all.