Rust插件库br-plugin的使用:高效扩展Rust应用功能的插件管理工具

br-plugin 插件

License Crates.io Version

支持功能

  • 缓存
  • 数据库
  • 消息队列
  • 模块化插件

安装

在项目目录中运行以下Cargo命令:

cargo add br-plugin

或者在Cargo.toml中添加以下行:

br-plugin = "1.6.8"

示例代码

以下是一个完整的br-plugin使用示例:

use br_plugin::{PluginManager, Plugin};

// 定义一个简单的插件
struct GreetPlugin;

impl Plugin for GreetPlugin {
    fn name(&self) -> &str {
        "greet"
    }

    fn execute(&self, input: &str) -> String {
        format!("Hello, {}!", input)
    }
}

fn main() {
    // 创建插件管理器
    let mut manager = PluginManager::new();
    
    // 注册插件
    manager.register(Box::new(GreetPlugin));
    
    // 使用插件
    let result = manager.execute("greet", "World");
    println!("{}", result.unwrap());  // 输出: Hello, World!
    
    // 缓存示例
    manager.cache_set("key", "value");
    let cached_value = manager.cache_get("key");
    println!("Cached value: {:?}", cached_value);
    
    // 数据库示例 (假设支持SQLite)
    manager.db_execute("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY)");
    
    // 消息队列示例
    manager.mq_publish("channel", "message");
}

这个示例展示了:

  1. 如何创建自定义插件
  2. 如何注册和使用插件
  3. 使用br-plugin提供的缓存功能
  4. 使用数据库操作功能
  5. 使用消息队列功能

br-plugin是一个MIT许可的Rust库,最新版本为1.6.8,大小约32.7 KiB。

完整示例代码

以下是一个更完整的br-plugin使用示例,展示了更多功能:

use br_plugin::{PluginManager, Plugin};
use std::error::Error;

// 定义两个不同类型的插件
struct GreetPlugin;
struct CalculatorPlugin;

impl Plugin for GreetPlugin {
    fn name(&self) -> &str {
        "greet"
    }

    fn execute(&self, input: &str) -> String {
        format!("Hello, {}!", input)
    }
}

impl Plugin for CalculatorPlugin {
    fn name(&self) -> &str {
        "calc"
    }

    fn execute(&self, input: &str) -> String {
        let parts: Vec<&str> = input.split_whitespace().collect();
        if parts.len() != 3 {
            return "Invalid input format. Use: number operator number".to_string();
        }
        
        let a: f64 = parts[0].parse().unwrap_or(0.0);
        let b: f64 = parts[2].parse().unwrap_or(0.0);
        
        match parts[1] {
            "+" => format!("Result: {}", a + b),
            "-" => format!("Result: {}", a - b),
            "*" => format!("Result: {}", a * b),
            "/" => format!("Result: {}", a / b),
            _ => "Unsupported operator".to_string(),
        }
    }
}

fn main() -> Result<(), Box<dyn Error>> {
    // 创建插件管理器
    let mut manager = PluginManager::new();
    
    // 注册多个插件
    manager.register(Box::new(GreetPlugin));
    manager.register(Box::new(CalculatorPlugin));
    
    // 使用greet插件
    let greeting = manager.execute("greet", "Rust Developer")?;
    println!("{}", greeting);
    
    // 使用calc插件进行数学运算
    let calc_result = manager.execute("calc", "10 + 20")?;
    println!("{}", calc_result);
    
    // 更复杂的缓存使用
    manager.cache_set("user:1", "Alice");
    manager.cache_set("user:2", "Bob");
    
    if let Some(user) = manager.cache_get("user:1") {
        println!("User 1: {}", user);
    }
    
    // 数据库操作
    manager.db_execute(
        "CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            email TEXT UNIQUE NOT NULL
        )"
    );
    
    manager.db_execute(
        "INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')"
    );
    
    // 消息队列操作
    manager.mq_publish("notifications", "New user registered");
    manager.mq_publish("logs", "User action completed");
    
    Ok(())
}

这个完整示例展示了:

  1. 创建多个不同类型的插件
  2. 更复杂的插件实现
  3. 缓存的高级用法
  4. 完整的数据库操作流程
  5. 多个消息队列发布示例
  6. 错误处理机制

所有功能都遵循原始内容中展示的API风格和MIT许可声明。


1 回复

Rust插件库br-plugin使用指南

介绍

br-plugin是一个用于Rust应用的轻量级插件管理系统,它允许开发者以模块化方式扩展应用功能而无需修改核心代码。该库提供了插件加载、生命周期管理和跨插件通信等核心功能,特别适合需要动态扩展功能的大型Rust应用。

主要特性

  • 动态插件加载和卸载
  • 简单的插件注册机制
  • 跨插件通信支持
  • 生命周期管理
  • 低开销设计

使用方法

基本配置

首先在Cargo.toml中添加依赖:

[dependencies]
br-plugin = "0.3"

定义插件

创建一个简单的插件:

use br_plugin::{Plugin, PluginContext, PluginResult};

struct MyPlugin;

impl Plugin for MyPlugin {
    fn name(&self) -> &str {
        "my_plugin"
    }

    fn on_load(&mut self, _ctx: &mut PluginContext) -> PluginResult<()> {
        println!("MyPlugin loaded!");
        Ok(())
    }

    fn on_unload(&mut self) -> PluginResult<()> {
        println!("MyPlugin unloaded!");
        Ok(())
    }
}

注册和使用插件

use br_plugin::{PluginManager, PluginContext};

fn main() {
    // 创建插件管理器
    let mut manager = PluginManager::new();
    
    // 注册插件
    manager.register(Box::new(MyPlugin));
    
    // 加载所有插件
    let mut ctx = PluginContext::new();
    manager.load_all(&mut ctx).expect("Failed to load plugins");
    
    // 执行插件功能
    if let Some(plugin) = manager.get_plugin("my_plugin") {
        println!("Found plugin: {}", plugin.name());
    }
    
    // 卸载所有插件
    manager.unload_all().expect("Failed to unload plugins");
}

跨插件通信

use br_plugin::{Plugin, PluginContext, PluginResult, PluginManager};

struct SenderPlugin;

impl Plugin for SenderPlugin {
    fn name(&self) -> &str {
        "sender"
    }

    fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
        ctx.emit("greeting", "Hello from sender!")?;
        Ok(())
    }
}

struct ReceiverPlugin {
    message: Option<String>,
}

impl Plugin for ReceiverPlugin {
    fn name(&self) -> &str {
        "receiver"
    }

    fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
        ctx.on("greeting", |data: &str| {
            self.message = Some(data.to_string());
            println!("Received: {}", data);
        });
        Ok(())
    }
}

fn main() {
    let mut manager = PluginManager::new();
    manager.register(Box::new(SenderPlugin));
    manager.register(Box::new(ReceiverPlugin { message: None }));
    
    let mut ctx = PluginContext::new();
    manager.load_all(&mut ctx).unwrap();
}

高级用法

插件配置

use serde::{Deserialize, Serialize};
use br_plugin::{Plugin, PluginContext, PluginResult};

#[derive(Serialize, Deserialize)]
struct MyConfig {
    enabled: bool,
    timeout: u32,
}

struct ConfigurablePlugin {
    config: MyConfig,
}

impl Plugin for ConfigurablePlugin {
    fn name(&self) -> &str {
        "configurable"
    }

    fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
        if let Some(config_str) = ctx.get_config(self.name()) {
            self.config = serde_json::from_str(&config_str)?;
        }
        
        println!("Plugin configured with: {:?}", self.config);
        Ok(())
    }
}

异步插件

use async_trait::async_trait;
use br_plugin::{AsyncPlugin, PluginContext, PluginResult};

struct AsyncExample;

#[async_trait]
impl AsyncPlugin for AsyncExample {
    fn name(&self) -> &str {
        "async_example"
    }

    async fn on_load(&mut self, _ctx: &mut PluginContext) -> PluginResult<()> {
        tokio::time::sleep(std::time::Duration::from_secs(1).await;
        println!("Async plugin loaded after delay");
        Ok(())
    }
}

最佳实践

  1. 保持插件小而专注 - 每个插件应该只做一件事
  2. 使用明确的命名空间避免冲突
  3. 合理处理插件加载失败的情况
  4. 考虑插件依赖关系
  5. 在生产环境中验证插件签名

br-plugin为Rust应用提供了灵活的扩展能力,通过合理的插件架构设计,可以显著提高大型应用的可维护性和可扩展性。

完整示例

下面是一个结合了基本插件、跨插件通信和配置功能的完整示例:

use br_plugin::{Plugin, PluginContext, PluginResult, PluginManager};
use serde::{Deserialize, Serialize};

// 配置结构体
#[derive(Debug, Serialize, Deserialize)]
struct AppConfig {
    greeting: String,
    repeat: u32,
}

// 发送消息的插件
struct GreetingSender;

impl Plugin for GreetingSender {
    fn name(&self) -> &str {
        "greeting_sender"
    }

    fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
        // 从配置中读取设置
        if let Some(config_str) = ctx.get_config(self.name()) {
            let config: AppConfig = serde_json::from_str(&config_str)?;
            
            // 发送配置中的问候消息
            for _ in 0..config.repeat {
                ctx.emit("greeting_event", config.greeting.clone())?;
            }
        }
        Ok(())
    }
}

// 接收消息的插件
struct GreetingReceiver {
    messages: Vec<String>,
}

impl Plugin for GreetingReceiver {
    fn name(&self) -> &str {
        "greeting_receiver"
    }

    fn on_load(&mut self, ctx: &mut PluginContext) -> PluginResult<()> {
        // 订阅greeting_event事件
        ctx.on("greeting_event", |data: String| {
            self.messages.push(data);
            println!("Received greeting: {}", self.messages.last().unwrap());
        });
        Ok(())
    }

    fn on_unload(&mut self) -> PluginResult<()> {
        println!("Received total {} greetings", self.messages.len());
        Ok(())
    }
}

fn main() -> PluginResult<()> {
    // 创建插件管理器
    let mut manager = PluginManager::new();
    
    // 注册插件
    manager.register(Box::new(GreetingSender));
    manager.register(Box::new(GreetingReceiver { messages: Vec::new() }));
    
    // 创建插件上下文并添加配置
    let mut ctx = PluginContext::new();
    let sender_config = AppConfig {
        greeting: "Hello from configured plugin!".to_string(),
        repeat: 3,
    };
    ctx.set_config("greeting_sender", &serde_json::to_string(&sender_config)?);
    
    // 加载所有插件
    manager.load_all(&mut ctx)?;
    
    // 卸载所有插件
    manager.unload_all()?;
    
    Ok(())
}

这个完整示例展示了:

  1. 插件的基本定义和实现
  2. 使用serde进行插件配置
  3. 插件间的事件通信
  4. 完整的插件生命周期管理

运行此示例将输出:

Received greeting: Hello from configured plugin!
Received greeting: Hello from configured plugin!
Received greeting: Hello from configured plugin!
Received total 3 greetings
回到顶部