-
Notifications
You must be signed in to change notification settings - Fork 78
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
feat: add BorshSerializeAsync
/BorshDeserializeAsync
(WIP)
#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 |
|
Nope, it should use stable, as it does. I suggest that you remove nightly-only toggles from rustfmt.toml in order to not clutter the log, as it clutters a local log (besides ci) too, when running. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pr is in an awe-inspiring state with respect to quality. left some comments.
the only desired change from async-generic
is to be able to dispatch doc-comments for sync/async variants (not really sure if it can or cannot do so already).
any other changes are not seen as required for borsh.
didn't look through all of the snapshots and some pair-wise comparisons of those (some number of combinations stays pending), but code-wise the review is mostly complete
@@ -15,6 +15,8 @@ pushd borsh | |||
cargo test --no-run | |||
cargo test | |||
cargo test --features derive | |||
cargo test --features derive,unstable__tokio | |||
cargo test --features derive,unstable__async-std | |||
cargo test --features unstable__schema |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
test: i guess such a line can be added, as it compile derives don't depend on anything in tokio and async-std
cargo test --features derive,unstable__async 'compile_derives::async_derives'
cargo test --features derive,unstable__tokio | ||
cargo test --features derive,unstable__async-std |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rant: these can be deleted for the current state of tests, as there's nothing runnable, but then they'll have to be re-added (anyway) for roundtrip tests
@@ -18,14 +18,14 @@ exclude = ["*.snap"] | |||
proc-macro = true | |||
|
|||
[dependencies] | |||
syn = { version = "2.0.81", features = ["full", "fold"] } | |||
syn = { version = "2.0.96", features = ["full", "fold"] } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rant: i don't see the reason for raising minimal version, though there was no comment left in toml file before this why a specific minimum is required too )
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This syn
version has MSRV of 1.61, so it should be compatible. A couple of new patches has come out, so I could set it higher
BorshSerializeAsync
/BorshDeserializeAsync
(WIP)
…table__async-std` features
@dj8yfo |
…. Use more readable async-generic syntax
|
||
#[cfg(feature = "de_strict_order")] | ||
// TODO: replace with `is_sorted` api when stabilizes https://github.com/rust-lang/rust/issues/53485 | ||
// TODO: first replace with `array_windows` api when stabilizes https://github.com/rust-lang/rust/issues/75027 | ||
// TODO: replace with `is_sorted` api once MSRV >= 1.82 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@dj8yfo Is this an OK update?
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.