diff --git a/crates/plugin_runtime/src/lib.rs b/crates/plugin_runtime/src/lib.rs index b59f03a55f9b5c35f3bdc78dcfe8d2ad1c6495d0..b008a98c287541c2cd73067fee6a59edd4d79fda 100644 --- a/crates/plugin_runtime/src/lib.rs +++ b/crates/plugin_runtime/src/lib.rs @@ -46,10 +46,9 @@ mod tests { .map(|output| output.stdout) }) .unwrap() - .init( - false, - include_bytes!("../../../plugins/bin/test_plugin.wasm"), - ) + .init(PluginBinary::Wasm( + include_bytes!("../../../plugins/bin/test_plugin.wasm").as_ref(), + )) .await .unwrap(); diff --git a/crates/plugin_runtime/src/plugin.rs b/crates/plugin_runtime/src/plugin.rs index 988c9263351041cc5d0d1f2c433824db4ee067c2..2767d9c4b876e0697f817774a155e7aab9a22561 100644 --- a/crates/plugin_runtime/src/plugin.rs +++ b/crates/plugin_runtime/src/plugin.rs @@ -345,8 +345,8 @@ impl PluginBuilder { /// Initializes a [`Plugin`] from a given compiled Wasm module. /// Both binary (`.wasm`) and text (`.wat`) module formats are supported. - pub async fn init>(self, precompiled: bool, module: T) -> Result { - Plugin::init(precompiled, module.as_ref(), self).await + pub async fn init<'a>(self, binary: PluginBinary<'a>) -> Result { + Plugin::init(binary, self).await } } @@ -379,6 +379,11 @@ impl WasiCtxAlloc { } } +pub enum PluginBinary<'a> { + Wasm(&'a [u8]), + Precompiled(&'a [u8]), +} + /// Represents a WebAssembly plugin, with access to the WebAssembly System Inferface. /// Build a new plugin using [`PluginBuilder`]. pub struct Plugin { @@ -406,7 +411,7 @@ impl Plugin { println!(); } - async fn init(precompiled: bool, module: &[u8], plugin: PluginBuilder) -> Result { + async fn init<'a>(binary: PluginBinary<'a>, plugin: PluginBuilder) -> Result { // initialize the WebAssembly System Interface context let engine = plugin.engine; let mut linker = plugin.linker; @@ -422,10 +427,9 @@ impl Plugin { }, ); - let module = if precompiled { - unsafe { Module::deserialize(&engine, module)? } - } else { - Module::new(&engine, module)? + let module = match binary { + PluginBinary::Precompiled(bytes) => unsafe { Module::deserialize(&engine, bytes)? }, + PluginBinary::Wasm(bytes) => Module::new(&engine, bytes)?, }; // set up automatic yielding based on configuration diff --git a/crates/zed/src/languages/language_plugin.rs b/crates/zed/src/languages/language_plugin.rs index 8417f0ff9a6f699878309f406a8ef875f3f76317..db96c6832908b65c181cd0223fef241dff17783f 100644 --- a/crates/zed/src/languages/language_plugin.rs +++ b/crates/zed/src/languages/language_plugin.rs @@ -4,7 +4,7 @@ use client::http::HttpClient; use futures::lock::Mutex; use gpui::executor::Background; use language::{LanguageServerName, LspAdapter}; -use plugin_runtime::{Plugin, PluginBuilder, PluginYield, WasiFn}; +use plugin_runtime::{Plugin, PluginBinary, PluginBuilder, PluginYield, WasiFn}; use std::{any::Any, path::PathBuf, sync::Arc}; use util::ResultExt; @@ -24,10 +24,9 @@ pub async fn new_json(executor: Arc) -> Result { .log_err() .map(|output| output.stdout) })? - .init( - true, - include_bytes!("../../../../plugins/bin/json_language.wasm.pre"), - ) + .init(PluginBinary::Precompiled(include_bytes!( + "../../../../plugins/bin/json_language.wasm.pre" + ))) .await?; PluginLspAdapter::new(plugin, executor).await