-
Notifications
You must be signed in to change notification settings - Fork 77
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WIP: Add generic async support #337
base: master
Are you sure you want to change the base?
Conversation
Should the |
To support |
@DanikVitek is this doable without |
# Conflicts: # Cargo.toml
I guess, if there is no need for the traits to be dyn-compatible, then the only difficulty is making the If the MSRV bump is not an issue, then it's even easier |
Ok, no. Both |
@DanikVitek can you support your assertion that the return types will need to be pin-boxed anyway by doing a minimal example in a repo outside of this pr with the right trait (BorshSerializeAsync/BorshDeserializeAsync) signatures and msrv 1.75? I think the common convention is that you cannot bump MSRV in patch releases, but in minor version releases you're free to do so. EDIT: if so (if they need to be pin-boxed anyway), i think we'll stick with |
I think the traits should be completely separate and not extend sync counterparts and lib user should be free to only implement/derive a subset or all of them if he/she desires. I was under the impression it's the case now, maybe i'm mistaken. |
Before diving into doing derive for new traits, i'd stop and do some tests with snapshots. @DanikVitek, can you choose some subset of types, which you consider core to borsh , and make sure the async counterparts serialize/deserialize to the same snapthos that the sync interface produces in tests? You're free to modify test code, as long you double check that existing snapshots aren't touched/renamed. Ideally this should be done by pure addition (no replacements/deletions) of test code (not modifying existing tests) and just checking the new snapshots are equal to older ones. This way it would be easy to verify during review that existing serialization format, provided by stable borsh subset, hasn't changed. If the existing test code changes, it kind of needs more attention to verify the old tests still run at all. It might be somewhat tedious to cover all existing (snapshot) tests at once, but that's one of the reason the feature should be made |
It appears that all of |
@DanikVitek Amazing job! I'd like to also invite you to join @race-of-sloths |
@race-of-sloths sounds nice |
@DanikVitek Thank you for your contribution! Your pull request is now a part of the Race of Sloths! Current status: waiting for scoringWe're waiting for maintainer to score this pull request with What is the Race of SlothsRace of Sloths is a friendly competition where you can participate in challenges and compete with other open-source contributors within your normal workflow For contributors:
For maintainers:
Feel free to check our website for additional details! Bot commands
|
@dj8yfo |
@DanikVitek i believe the lint https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/async_fn_in_trait/static.ASYNC_FN_IN_TRAIT.html is just a reminder to do #[trait_variant::make(Send)]
pub trait Handler {
async fn handle(&mut self, input: &Input) -> Result<String, String>;
async fn handle2(self, input: &'static str) -> Result<String, String>;
}
struct Type {
pub field: String,
}
impl Handler for Type {
async fn handle(&mut self, input: &Input) -> Result<String, String> {
let local_var = "fsdfs sdf sdf".to_owned();
self.field.push_str(&input.field);
self.field.push_str(local_var.as_str());
Ok(self.field.clone())
}
async fn handle2(mut self, input: &'static str) -> Result<String, String> {
let local_var = "fsdfs sdf sdf".to_owned();
self.field.push_str(&input);
self.field.push_str(local_var.as_str());
Ok(self.field)
}
} and it appears to run. Not hundred % sure it's gonna work with async borsh traits, but looks like ` |
Yes. To be more precise, the async block declares an anonymous type that implements I don't completely understand the behaviour of |
|
@DanikVitek doing a counterpart of https://github.com/near/borsh-rs/blob/master/borsh/tests/tests.rs#L21-L23 #[cfg(feature = "unstable__async")]
mod async_derives {
mod test_generic_structs;
mod test_generic_enums;
mod test_recursive_structs;
} might be a way to ensure different variations compile in scope of DanikVitek#1 Please add a line or 2 here https://github.com/near/borsh-rs/blob/master/.github/test.sh#L17 , cargo test --features derive,unstable__async |
Should |
Merge `master` into `async/derive`
Merge `master` into `async/derive`
…rive macros for async traits
If it's ok, I'd like to deal with the #340 first, as it would be just a patch |
Add default `read_exact` impl. Fix doc test
feat: implement derive macro for async traits
While trying this implementation in my personal project, I've encountered this kind of error. I suppose it's because of the |
Ok, the only way I managed to fix this was to simple copy-paste the generated function body into |
The conversation started in #150.
async-generic
PR: scouten/async-generic#17This implementation should be more flexible, as it allows for different runtimes and provides traits for manual implementation in case of any uncommon runtime.