Description
Summary
This proposal proposes to change the way how async api
does implemented. It makes async api
more clearly for use and extend.
Motivation
Our current approach to implement trait primitives as depends on nb
crate. It was actually on start of this project but after version 1.36
rust already have async traits
and methodology for work with it. So in 2018 edition of rust lang we have language words as async
, await
. The marcosses exported by nb
are conflicted with key words, we need to use r#
prefix for each macros use.
This RFC attempts to change implementation to core types
based implementation. It will be more effective and more conform rust language ideas.
Detailed design
This RFC inspired of PR #13, but after apply external crate I redesign for use core functionality because it will be better than external depends.
For example we have interface for serial:
use core::task::Poll;
/// A serial interface
pub trait Serial {
/// Error type associated to this serial interface
type Error;
/// Reads a single byte
fn read(&mut self) -> Poll<Result<u8, Self::Error>>;
/// Writes a single byte
fn write(&mut self, byte: u8) -> Poll<Result<(), Self::Error>>;
}
It use core::task::Poll
as point of async
run status. It was easy for implement and it isn't depends on nb
or another external crates.
Alternatives
Don't implement this RFC.
Uresolved questions:
- More clear examples of right use
async
code. - How we need to update depend crates?
- Do we need to rewrite
nb
prefer than rewriteasync
api ofembedded-hal
?