feat(plugin-api): Better method chaining (Rust) (#3045)

* feat(plugin-api): Better method chaining (Rust)

* Work around faulty force-link of `cabi_realloc`

* Stub for `pumpkin-plugin-api` as well

* Revert "Work around faulty force-link of `cabi_realloc`"

This reverts commit 4aa4d4370b.
This commit is contained in:
Demetrius Kanios
2026-08-24 23:03:11 -07:00
committed by GitHub
parent 5bf6349900
commit 67eaa91400
4 changed files with 75 additions and 64 deletions

106
Cargo.lock generated
View File

@@ -5296,16 +5296,6 @@ dependencies = [
"wasmparser 0.252.0", "wasmparser 0.252.0",
] ]
[[package]]
name = "wasm-encoder"
version = "0.254.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09480d646178e5fdd12bb06e812d0af9a3a191dbc9cd697fdc86687beade7393"
dependencies = [
"leb128fmt",
"wasmparser 0.254.0",
]
[[package]] [[package]]
name = "wasm-encoder" name = "wasm-encoder"
version = "0.257.1" version = "0.257.1"
@@ -5317,15 +5307,25 @@ dependencies = [
] ]
[[package]] [[package]]
name = "wasm-metadata" name = "wasm-encoder"
version = "0.254.0" version = "0.258.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b01df5f3b4ca7881e843f3bc0fb8a3905d79c68692250dcb8e33e698705ccdb6" checksum = "e974fe6821a8cf64575d51ea2194e2c8f77e7b66e9afe7419ce8a97f9ee0d251"
dependencies = [
"leb128fmt",
"wasmparser 0.258.0",
]
[[package]]
name = "wasm-metadata"
version = "0.258.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18a11585adb92fe9b55ad1d760e8d8fb5d87e0d2e303cb8eed57f078d54293a2"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"indexmap", "indexmap",
"wasm-encoder 0.254.0", "wasm-encoder 0.258.0",
"wasmparser 0.254.0", "wasmparser 0.258.0",
] ]
[[package]] [[package]]
@@ -5343,23 +5343,23 @@ dependencies = [
[[package]] [[package]]
name = "wasmparser" name = "wasmparser"
version = "0.254.0" version = "0.257.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5769a29f799fbab136aaf65b4fe5384cd7d93fe6fc9ba0dcb6c8382a1f16e27" checksum = "d92fc335fb6d48f46bda1d8b26b69e28320c15ac3272208333833d6e217e2b4a"
dependencies = [ dependencies = [
"bitflags 2.13.1", "bitflags 2.13.1",
"hashbrown 0.17.1",
"indexmap", "indexmap",
"semver", "semver",
] ]
[[package]] [[package]]
name = "wasmparser" name = "wasmparser"
version = "0.257.1" version = "0.258.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d92fc335fb6d48f46bda1d8b26b69e28320c15ac3272208333833d6e217e2b4a" checksum = "d9a61719f93a87b16d325921e251800c4833f8fab50fa21c7de73aed50086313"
dependencies = [ dependencies = [
"bitflags 2.13.1", "bitflags 2.13.1",
"hashbrown 0.17.1",
"indexmap", "indexmap",
"semver", "semver",
] ]
@@ -6022,29 +6022,29 @@ dependencies = [
[[package]] [[package]]
name = "wit-bindgen" name = "wit-bindgen"
version = "0.60.0" version = "0.61.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a301904d6657d6364c758d869e5389d05d393b16d5b65db60b4f03cbe71bb80d" checksum = "fbfef9403167686bfe35ffa8787df4c0f50742e5b0f471c7fb156a6614193c5d"
dependencies = [ dependencies = [
"wit-bindgen-rust-macro", "wit-bindgen-rust-macro",
] ]
[[package]] [[package]]
name = "wit-bindgen-core" name = "wit-bindgen-core"
version = "0.60.0" version = "0.61.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48521bb96e56cbb9e031ad306c80dc20e89e69e49ada02781ee06f60fbcb545f" checksum = "4814f3904ce1f5ba05f82d868edd2e0fc197b3f87f930b0777ca795de17df772"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"heck", "heck",
"wit-parser 0.254.0", "wit-parser 0.258.0",
] ]
[[package]] [[package]]
name = "wit-bindgen-rust" name = "wit-bindgen-rust"
version = "0.60.0" version = "0.61.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3df3fe9b9a0066f82fd0c2f07f79d0ffc0f85c53fa5f998516d8722712479042" checksum = "b4c760bc63d9d3271f0e6476eba4c37707d983cf492095a9db1fed232f29d551"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"heck", "heck",
@@ -6058,9 +6058,9 @@ dependencies = [
[[package]] [[package]]
name = "wit-bindgen-rust-macro" name = "wit-bindgen-rust-macro"
version = "0.60.0" version = "0.61.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d689c4bc9d6af067c651cfba444766343c9a4bdef15fad1e2efab95c0c277af0" checksum = "3521448f8b53272f9aa1caf134e8f008ce13a2b43b832672435c0c5328b01077"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"prettyplease", "prettyplease",
@@ -6073,9 +6073,9 @@ dependencies = [
[[package]] [[package]]
name = "wit-component" name = "wit-component"
version = "0.254.0" version = "0.258.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0e65bb94c369b3c4741ce3d1d2704b1fec93db7c540df0e521a097e7ceeb5be" checksum = "481b5c47b2ecce0389b5e08a05557d6a190c9cd761773b8880a8017ee04dc7ef"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bitflags 2.13.1", "bitflags 2.13.1",
@@ -6084,10 +6084,10 @@ dependencies = [
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
"wasm-encoder 0.254.0", "wasm-encoder 0.258.0",
"wasm-metadata", "wasm-metadata",
"wasmparser 0.254.0", "wasmparser 0.258.0",
"wit-parser 0.254.0", "wit-parser 0.258.0",
] ]
[[package]] [[package]]
@@ -6122,25 +6122,6 @@ dependencies = [
"wasmparser 0.252.0", "wasmparser 0.252.0",
] ]
[[package]]
name = "wit-parser"
version = "0.254.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1655131e4f7d3f0cb141f6eca71315ca40eff0f3d4de7cff0a82bacedd8c89b4"
dependencies = [
"anyhow",
"hashbrown 0.17.1",
"id-arena",
"indexmap",
"log",
"semver",
"serde",
"serde_derive",
"serde_json",
"unicode-ident",
"wasmparser 0.254.0",
]
[[package]] [[package]]
name = "wit-parser" name = "wit-parser"
version = "0.257.1" version = "0.257.1"
@@ -6160,6 +6141,25 @@ dependencies = [
"wasmparser 0.257.1", "wasmparser 0.257.1",
] ]
[[package]]
name = "wit-parser"
version = "0.258.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff4daaa3cd97ae49ecd0a99dc009d453f93e0f083dd3be38c0f24a83a93e37ac"
dependencies = [
"anyhow",
"hashbrown 0.17.1",
"id-arena",
"indexmap",
"log",
"semver",
"serde",
"serde_derive",
"serde_json",
"unicode-ident",
"wasmparser 0.258.0",
]
[[package]] [[package]]
name = "wnaf" name = "wnaf"
version = "0.14.0" version = "0.14.0"

View File

@@ -224,7 +224,7 @@ hyper = { version = "^1.11", default-features = false }
axum = { version = "0.8.9", default-features = false, features = ["http1", "tokio"] } axum = { version = "0.8.9", default-features = false, features = ["http1", "tokio"] }
webrtc = { version = "0.20.3" } webrtc = { version = "0.20.3" }
async-trait = "0.1" async-trait = "0.1"
wit-bindgen = { version = "0.60", default-features = false, features = ["macros"] } wit-bindgen = { version = "0.61", default-features = false, features = ["macros"] }
postcard = { version = "1.1", default-features = false, features = ["alloc"] } postcard = { version = "1.1", default-features = false, features = ["alloc"] }
tracing-serde-structured = { version = "0.4", default-features = false } tracing-serde-structured = { version = "0.4", default-features = false }

View File

@@ -109,9 +109,7 @@ impl Command {
.unwrap_or_else(|e| e.into_inner()) .unwrap_or_else(|e| e.into_inner())
.insert(id, Box::new(handler)); .insert(id, Box::new(handler));
self.execute_with_handler_id(id); self.execute_with_handler_id(id)
self
} }
} }
@@ -129,9 +127,7 @@ impl CommandNode {
.unwrap_or_else(|e| e.into_inner()) .unwrap_or_else(|e| e.into_inner())
.insert(id, Box::new(handler)); .insert(id, Box::new(handler));
self.execute_with_handler_id(id); self.execute_with_handler_id(id)
self
} }
/// Attaches a server-side suggestion handler to this argument node. /// Attaches a server-side suggestion handler to this argument node.
@@ -147,9 +143,7 @@ impl CommandNode {
.unwrap_or_else(|e| e.into_inner()) .unwrap_or_else(|e| e.into_inner())
.insert(id, Box::new(handler)); .insert(id, Box::new(handler));
self.suggest_with_handler_id(id); self.suggest_with_handler_id(id)
self
} }
} }

View File

@@ -176,7 +176,11 @@ mod wit {
skip: ["init-plugin"], skip: ["init-plugin"],
path: "../pumpkin-plugin-wit/v0.1", path: "../pumpkin-plugin-wit/v0.1",
world: "plugin", world: "plugin",
enable_method_chaining: true chainable_methods: [
"pumpkin:plugin/command@0.1.0#command",
"pumpkin:plugin/command@0.1.0#command-node",
"pumpkin:plugin/text@0.1.0#text-component"
]
}); });
use super::Component; use super::Component;
@@ -463,3 +467,16 @@ pub mod persistent_data;
pub use persistent_data::PersistentDataHolder; pub use persistent_data::PersistentDataHolder;
/// Game rules definitions and values. /// Game rules definitions and values.
pub use wit::pumpkin::plugin::game_rules::{GameRule, GameRuleValue}; pub use wit::pumpkin::plugin::game_rules::{GameRule, GameRuleValue};
/// Stub for component model `cabi_realloc`
/// Remove me after bytecodealliance/wit-bindgen#1697 makes it to release
#[cfg(not(target_arch = "wasm32"))]
#[unsafe(no_mangle)]
pub extern "C" fn cabi_realloc(
_old_ptr: *mut u8,
_old_len: usize,
_align: usize,
_new_len: usize,
) -> *mut u8 {
panic!("Call to cabi_realloc on native?")
}