Skip to content

Commit 9e93f29

Browse files
Add enable_method_chaining to the generate macro
1 parent ba3a6e5 commit 9e93f29

3 files changed

Lines changed: 33 additions & 0 deletions

File tree

crates/guest-rust/macro/src/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ impl Parse for Config {
171171
}
172172
opts.async_ = val;
173173
}
174+
Opt::EnableMethodChaining(enable) => {
175+
opts.enable_method_chaining = enable.value();
176+
}
174177
}
175178
}
176179
} else {
@@ -324,6 +327,7 @@ mod kw {
324327
syn::custom_keyword!(disable_custom_section_link_helpers);
325328
syn::custom_keyword!(imports);
326329
syn::custom_keyword!(debug);
330+
syn::custom_keyword!(enable_method_chaining);
327331
}
328332

329333
#[derive(Clone)]
@@ -404,6 +408,7 @@ enum Opt {
404408
DisableCustomSectionLinkHelpers(syn::LitBool),
405409
Async(AsyncFilterSet, Span),
406410
Debug(syn::LitBool),
411+
EnableMethodChaining(syn::LitBool),
407412
}
408413

409414
impl Parse for Opt {
@@ -568,6 +573,10 @@ impl Parse for Opt {
568573
input.parse::<kw::debug>()?;
569574
input.parse::<Token![:]>()?;
570575
Ok(Opt::Debug(input.parse()?))
576+
} else if l.peek(kw::enable_method_chaining) {
577+
input.parse::<kw::enable_method_chaining>()?;
578+
input.parse::<Token![:]>()?;
579+
Ok(Opt::EnableMethodChaining(input.parse()?))
571580
} else if l.peek(Token![async]) {
572581
let span = input.parse::<Token![async]>()?.span;
573582
input.parse::<Token![:]>()?;

crates/guest-rust/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,11 @@ extern crate std;
860860
/// "-export:wasi:http/handler@0.3.0-draft#handle",
861861
/// "all",
862862
/// ],
863+
///
864+
/// // All resource methods with empty returns are instead generated as
865+
/// // returning `-> &Self`, to permit method chaining (e.g. for builder).
866+
/// // This expectation is also imposed on exports.
867+
/// enable_method_chaining: true,
863868
/// });
864869
/// ```
865870
///

crates/rust/tests/codegen.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,22 @@ mod retyped_list {
216216
}
217217
});
218218
}
219+
220+
#[allow(unused, reason = "testing codegen, not functionality")]
221+
mod method_chaining {
222+
wit_bindgen::generate!({
223+
inline: r#"
224+
package test:method-chaining;
225+
world test {
226+
resource a {
227+
constructor();
228+
set-a: func(arg: u32);
229+
set-b: func(arg: bool);
230+
do: func();
231+
}
232+
}
233+
"#,
234+
generate_all,
235+
enable_method_chaining: true
236+
});
237+
}

0 commit comments

Comments
 (0)