Skip to content

Commit a522c42

Browse files
committed
feat: Accept async upgradeneeded closures
Closes #30
1 parent dac75a6 commit a522c42

File tree

18 files changed

+737
-195
lines changed

18 files changed

+737
-195
lines changed

.github/workflows/test.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ jobs:
138138
- --features "indices cursors streams serde"
139139
- --features "dates serde"
140140
- --features "cursors serde"
141+
- --features "async-upgrade"
142+
- --features "tx-done"
143+
- --features "async-upgrade tx-done"
141144

142145
done:
143146
name: All tests

Cargo.lock

Lines changed: 59 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ include = [
2323
]
2424

2525
[features]
26+
async-upgrade = []
2627
cursors = [
2728
"web-sys/IdbCursor",
2829
"web-sys/IdbCursorWithValue",
@@ -47,10 +48,12 @@ serde = [
4748
]
4849
streams = [
4950
"dep:futures-core",
51+
"wasm_evt_listener/streams",
5052
]
5153
switch = []
54+
tx-done = ["dep:wasm_evt_listener"]
5255
typed-arrays = []
53-
version-change = ["tokio/macros"]
56+
version-change = ["tokio/macros", "dep:wasm_evt_listener"]
5457
_serialise-deserialise-dyn = []
5558

5659
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -81,6 +84,7 @@ uuid = "1.8"
8184
wasm-bindgen = "0.2.95"
8285
wasm-bindgen-futures = "0.4.45"
8386
wasm-bindgen-test = "0.3.45"
87+
wasm_evt_listener = "0.1"
8488
web-time = "1.1"
8589
web-sys = "0.3.72"
8690

@@ -105,6 +109,7 @@ thiserror = { workspace = true }
105109
tokio = { workspace = true, features = ["sync"], default-features = false }
106110
wasm-bindgen = { workspace = true }
107111
wasm-bindgen-futures = { workspace = true }
112+
wasm_evt_listener = { workspace = true, optional = true }
108113
web-time = { workspace = true, optional = true }
109114

110115
[dependencies.internal_macros]

internal_macros/src/generic_bounds.rs

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,32 @@
11
use crate::commons::FnTarget;
22
use crate::TokenStream1;
3+
use macroific::prelude::*;
4+
use proc_macro2::Ident;
35
use quote::ToTokens;
4-
use syn::punctuated::Punctuated;
56
use syn::{parse_quote, Error, WherePredicate};
67

7-
#[inline]
8-
pub(super) fn exec(spec: TokenStream1, target: TokenStream1) -> TokenStream1 {
9-
match syn::parse::<Opts>(spec) {
10-
Ok(opts) => match syn::parse::<FnTarget>(target.clone()) {
11-
Ok(mut target) => {
12-
opts.extend_target(&mut target);
13-
target.into_token_stream().into()
14-
}
15-
Err(e) => on_err(target, e),
16-
},
17-
Err(e) => on_err(target, e),
18-
}
19-
}
20-
218
macro_rules! make_opts {
22-
($struct_name: ident => { $($($opt: ident)|+ => $predicate: ty),+ $(,)? }) => {
23-
/// Options list
9+
($struct_name: ident => {
10+
$($($opt: ident)|+ => $predicate: ty),+
11+
$(,[custom] => {
12+
$($extra_opt: ident => $extra_ty: ty),+ $(,)?
13+
})? $(,)?
14+
}) => {
15+
/// # Options list
2416
///
2517
/// | Option | Predicate |
2618
/// |--------|-----------|
2719
$($(#[doc = concat!(" | `", stringify!($opt), "` | `", stringify!($predicate), "` |")])+)+
20+
///
21+
/// # Extras
22+
///
23+
/// | Option | Type |
24+
/// |--------|-----------|
25+
$($(#[doc = concat!(" | `", stringify!($extra_opt), "` | `", stringify!($extra_ty), "` |")])+)+
2826
#[derive(::macroific::attr_parse::AttributeOptions)]
2927
pub(super) struct $struct_name {
30-
$($($opt: ::syn::punctuated::Punctuated<proc_macro2::Ident, ::syn::Token![,]>),+),+
28+
$($($opt: ::syn::punctuated::Punctuated<proc_macro2::Ident, ::syn::Token![,]>,)+)+
29+
$($($extra_opt: Option<$extra_ty>,)+)?
3130
}
3231

3332
impl ::syn::parse::Parse for $struct_name {
@@ -42,6 +41,9 @@ macro_rules! make_opts {
4241
$($(if !self.$opt.is_empty() {
4342
extend_generics(self.$opt, target, ::quote::quote!($predicate));
4443
})+)+
44+
$($(if let Some($extra_opt) = self.$extra_opt {
45+
$extra_opt.extend_target(target);
46+
})+)?
4547
}
4648
}
4749
};
@@ -52,18 +54,61 @@ make_opts!(Opts => {
5254
db_version => crate::factory::DBVersion,
5355
blocked_cb => ::core::ops::FnOnce(crate::database::VersionChangeEvent) -> crate::Result<()> + 'static,
5456
upgrade_cb => ::core::ops::FnOnce(crate::database::VersionChangeEvent, crate::database::Database) -> crate::Result<()> + 'static,
57+
[custom] => {
58+
upgrade_async_cb => UpgradeAsyncCb,
59+
},
5560
});
5661

62+
#[inline]
63+
pub(super) fn exec(spec: TokenStream1, target: TokenStream1) -> TokenStream1 {
64+
match syn::parse::<Opts>(spec) {
65+
Ok(opts) => match syn::parse::<FnTarget>(target.clone()) {
66+
Ok(mut target) => {
67+
opts.extend_target(&mut target);
68+
target.into_token_stream().into()
69+
}
70+
Err(e) => on_err(target, e),
71+
},
72+
Err(e) => on_err(target, e),
73+
}
74+
}
75+
76+
#[derive(ParseOption)]
77+
struct UpgradeAsyncCb {
78+
#[attr_opts(default = false)]
79+
fun: Ident,
80+
81+
#[attr_opts(default = false)]
82+
fut: Ident,
83+
}
84+
85+
impl UpgradeAsyncCb {
86+
fn extend_target(self, target: &mut FnTarget) {
87+
let Self { fun, fut } = self;
88+
let wheres = [
89+
parse_quote!(#fun: ::core::ops::FnOnce(crate::database::VersionChangeEvent, crate::database::Database) -> #fut + 'static),
90+
parse_quote!(#fut: ::core::future::Future<Output = crate::Result<()>> + 'static),
91+
];
92+
93+
target
94+
.generics_mut()
95+
.make_where_clause()
96+
.predicates
97+
.extend::<[WherePredicate; 2]>(wheres);
98+
}
99+
}
100+
57101
fn on_err(mut target: TokenStream1, e: Error) -> TokenStream1 {
58102
let e: TokenStream1 = e.into_compile_error().into();
59103
target.extend(e);
60104
target
61105
}
62106

63-
fn extend_generics<T, I, P>(idents: Punctuated<I, P>, target: &mut FnTarget, ext_with: T)
107+
fn extend_generics<T, Iter, Item>(idents: Iter, target: &mut FnTarget, ext_with: T)
64108
where
65109
T: ToTokens,
66-
I: ToTokens,
110+
Item: ToTokens,
111+
Iter: IntoIterator<Item = Item>,
67112
{
68113
let iter = idents
69114
.into_iter()

0 commit comments

Comments
 (0)