Skip to content

Commit

Permalink
Merge pull request #82 from Snowiiii/plugins-feature
Browse files Browse the repository at this point in the history
Make a way to disable extism
  • Loading branch information
Snowiiii authored Sep 7, 2024
2 parents 01a71d6 + f3728a1 commit ef3923c
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 37 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ tokio = { version = "1.40", features = [
"sync",
] }
rayon = "1.10.0"
uuid = { version = "1.10.0", features = ["serde", "v3"] }
uuid = { version = "1.10.0", features = ["serde", "v3", "v4"] }
derive_more = { version = "1.0.0", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
6 changes: 5 additions & 1 deletion pumpkin-plugin/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ name = "pumpkin-plugin"
version.workspace = true
edition.workspace = true

[features]
default = []
plugins = ["dep:extism"]

[dependencies]
serde.workspace = true
log.workspace = true
extism = "1.6.0"
extism = { version = "1.6.0", optional = true }
6 changes: 4 additions & 2 deletions pumpkin-plugin/src/api/identifer.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
#[cfg(feature = "plugins")]
use extism::{convert::Msgpack, host_fn, FromBytes, ToBytes};
use serde::{Deserialize, Serialize};

/// Used to keep track of things created by plugins.
/// This can include things like events, commands, etc.
#[derive(Hash, PartialEq, Eq, ToBytes, FromBytes, Serialize, Deserialize)]
#[derive(Hash, PartialEq, Eq, ToBytes, FromBytes, serde::Serialize, serde::Deserialize)]
#[cfg(feature = "plugins")]
#[encoding(Msgpack)] // TODO: Switch to protocal buffers for smaller size
struct Identifier {
namespace: String,
path: String,
}

#[cfg(feature = "plugins")]
host_fn!(new(namespace: String, path: String) -> Result<Identifier, _> {
Ok(Identifier { namespace, path })
});
78 changes: 46 additions & 32 deletions pumpkin-plugin/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,51 +1,65 @@
mod api;

use std::path::Path;

#[cfg(feature = "plugins")]
use extism::{Manifest, Plugin, Wasm};

pub const PLUGIN_DIR: &str = "plugins";

pub struct PumpkinPlugin {
#[cfg(feature = "plugins")]
_plugin: Plugin,
}

pub struct PluginLoader {
plugins: Vec<Plugin>,
plugins: Vec<PumpkinPlugin>,
}

impl PluginLoader {
pub fn load() -> Self {
let plugin_dir = Path::new(PLUGIN_DIR);
if !plugin_dir.exists() || !plugin_dir.is_dir() {
log::info!("Creating plugins dir...");
std::fs::create_dir(plugin_dir).expect("Failed to create Plugin dir");
return Self { plugins: vec![] };
}
let files = std::fs::read_dir(plugin_dir).expect("Failed to read plugin dir");
let mut plugins = Vec::new();
for file in files {
let file = file.expect("Failed to get Plugin file");
let path = file.path();
if path
.extension()
.expect("Failed to get Plugin file extension")
== "wasm"
{
log::info!(
"Loading Plugin {:?}",
path.file_name().expect("Failed to get Plugin file name")
);
let wasm = Wasm::file(path);
let manifest = Manifest::new([wasm]);
let mut plugin = Plugin::new(&manifest, [], true).unwrap();
plugin
.call::<(), ()>("on_enable", ())
.expect("Failed to call on_enable funcation");
plugins.push(plugin);
#[cfg(feature = "plugins")]
{
use std::path::Path;
let plugin_dir = Path::new(PLUGIN_DIR);
if !plugin_dir.exists() || !plugin_dir.is_dir() {
log::info!("Creating plugins dir...");
std::fs::create_dir(plugin_dir).expect("Failed to create Plugin dir");
return Self { plugins: vec![] };
}
let files = std::fs::read_dir(plugin_dir).expect("Failed to read plugin dir");
let mut plugins = Vec::new();
for file in files {
let file = file.expect("Failed to get Plugin file");
let path = file.path();
if path
.extension()
.expect("Failed to get Plugin file extension")
== "wasm"
{
log::info!(
"Loading Plugin {:?}",
path.file_name().expect("Failed to get Plugin file name")
);
let wasm = Wasm::file(path);
let manifest = Manifest::new([wasm]);
let mut plugin = Plugin::new(&manifest, [], true).unwrap();
plugin
.call::<(), ()>("on_enable", ())
.expect("Failed to call on_enable funcation");
let pumpkin_plugin = PumpkinPlugin { _plugin: plugin };
plugins.push(pumpkin_plugin);
}
}

Self { plugins }
}

Self { plugins }
#[cfg(not(feature = "plugins"))]
Self {
plugins: Vec::new(),
}
}

pub fn plugins(&mut self) -> &mut Vec<Plugin> {
pub fn plugins(&mut self) -> &mut Vec<PumpkinPlugin> {
&mut self.plugins
}
}
3 changes: 2 additions & 1 deletion pumpkin/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ description = "Empowering everyone to host fast and efficient Minecraft servers.
edition = "2021"

[features]
default = []
default = ["plugins"]
plugins = ["pumpkin-plugin/plugins"]

[dependencies]
# pumpkin
Expand Down

0 comments on commit ef3923c

Please sign in to comment.