Rust插件库janus_core的使用:高效构建模块化应用的核心工具库

Rust插件库janus_core的使用:高效构建模块化应用的核心工具库

janus_core 包含用于各种 Janus 目标的类型定义和支持代码。它不应该被直接依赖。janus_core 是通过 GitHub Action 在创建 janus 发布时发布到 crates.io 的。

Build Status latest version docs badge

安装

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

cargo add janus_core

或者将以下行添加到您的 Cargo.toml 中:

janus_core = "0.7.78"

示例代码

以下是内容中提供的示例代码:

use janus_core::time::Clock;
use std::time::{SystemTime, UNIX_EPOCH};

// 示例:使用Janus核心的时间模块
fn main() {
    // 创建一个时钟实例
    let clock = Clock::new(SystemTime::now().duration_since(UNIX_EPOCH).unwrap());
    
    // 获取当前时间
    let current_time = clock.now();
    println!("Current time (Janus timestamp): {:?}", current_time);
    
    // 模拟时间前进
    let later = current_time.add(&chrono::Duration::seconds(10));
    println!("Time after 10 seconds: {:?}", later);
}

完整示例代码

以下是一个更完整的示例,展示如何使用 janus_core 的其他功能:

use janus_core::{time::Clock, error::Error};
use std::time::{SystemTime, UNIX_EPOCH};

// 示例:使用Janus核心库的多个功能
fn main() -> Result<(), Error> {
    // 1. 时间模块使用
    let clock = Clock::new(SystemTime::now().duration_since(UNIX_EPOCH)?);
    let current_time = clock.now();
    println!("当前时间: {:?}", current_time);
    
    // 2. 错误处理
    match clock.now().to_system_time() {
        Ok(time) => println!("系统时间: {:?}", time),
        Err(e) => eprintln!("时间转换错误: {}", e),
    }
    
    // 3. 时间计算
    let future = current_time.add(&chrono::Duration::days(1));
    println!("24小时后的时间: {:?}", future);
    
    Ok(())
}

元数据

  • 版本: v1.81.0
  • 许可证: MPL-2.0
  • 大小: 72.9 KiB

所有者

  • divviup/committers 团队
  • divviup-github-automation 用户

请注意,janus_core 是 Janus 项目的内部核心库,通常不应直接用于应用程序开发。如需使用 Janus 功能,建议通过 Janus 提供的更高级别接口进行操作。


1 回复

Rust插件库janus_core的使用:高效构建模块化应用的核心工具库

介绍

janus_core是一个用于构建模块化Rust应用程序的核心工具库,它提供了一套轻量级但功能强大的插件系统架构。这个库特别适合需要动态加载、卸载和管理功能模块的应用程序。

主要特性

  • 轻量级插件系统架构
  • 动态加载和卸载模块
  • 模块间通信机制
  • 生命周期管理
  • 依赖解析

安装

在Cargo.toml中添加依赖:

[dependencies]
janus_core = "0.1"  # 请使用最新版本号

基本使用方法

1. 定义插件接口

use janus_core::plugin::{Plugin, PluginMetadata};

pub trait CalculatorPlugin: Plugin {
    fn add(&self, a: i32, b: i32) -> i32;
    fn subtract(&self, a: i32, b: i32) -> i32;
}

2. 实现插件

use janus_core::plugin::{Plugin, PluginMetadata};

struct BasicCalculator;

impl Plugin for BasicCalculator {
    fn metadata(&self) -> PluginMetadata {
        PluginMetadata {
            id: "basic_calculator".to_string(),
            name: "Basic Calculator".to_string(),
            version: "1.0.0".to_string(),
        }
    }
}

impl CalculatorPlugin for BasicCalculator {
    fn add(&self, a: i32, b: i32) -> i32 {
        a + b
    }
    
    fn subtract(&self, a: i32, b: i32) -> i32 {
        a - b
    }
}

3. 注册和使用插件

use janus_core::plugin_manager::PluginManager;

fn main() {
    let mut manager = PluginManager::new();
    
    // 注册插件
    manager.register_plugin(Box::new(BasicCalculator));
    
    // 获取插件并调用功能
    if let Some(calc) = manager.get_plugin::<dyn CalculatorPlugin>("basic_calculator") {
        println!("5 + 3 = {}", calc.add(5, 3));
        println!("5 - 3 = {}", calc.subtract(5, 3));
    }
}

高级用法

动态加载插件

use janus_core::dynamic_loading::DynamicPluginLoader;

fn load_dynamic_plugin() {
    let loader = DynamicPluginLoader::new();
    match loader.load_plugin("./target/debug/libadvanced_calculator.so") {
        Ok(plugin) => {
            let mut manager = PluginManager::new();
            manager.register_plugin(plugin);
            // 使用插件...
        },
        Err(e) => eprintln!("Failed to load plugin: {}", e),
    }
}

插件间通信

use janus_core::messaging::{Message, MessageBus};

struct LogMessage {
    content: String,
}

impl Message for LogMessage {
    fn type_id(&self) -> &'static str {
        "log_message"
    }
}

// 在插件中发送消息
fn send_log(manager: &PluginManager) {
    let bus = manager.message_bus();
    bus.send(LogMessage {
        content: "Plugin initialized".to_string(),
    });
}

// 在另一个插件中接收消息
fn setup_message_handler(manager: &PluginManager) {
    let bus = manager.message_bus();
    bus.subscribe("log_message", |msg: &dyn Message| {
        if let Some(log_msg) = msg.as_any().downcast_ref::<LogMessage>() {
            println!("Received log: {}", log_msg.content);
        }
    });
}

最佳实践

  1. 明确插件边界:每个插件应该专注于单一功能
  2. 版本兼容性:考虑插件接口的向后兼容性
  3. 错误处理:妥善处理插件加载和调用的错误
  4. 资源管理:确保插件卸载时释放所有资源

完整示例

以下是一个完整的示例项目,展示如何使用janus_core构建模块化应用:

  1. 首先创建项目结构:
my_app/
├── Cargo.toml
├── src/
│   ├── main.rs
│   └── plugins/
│       ├── calculator/
│       │   ├── mod.rs
│       │   └── basic.rs
│       └── logger/
│           ├── mod.rs
│           └── file_logger.rs
  1. Cargo.toml内容:
[package]
name = "my_app"
version = "0.1.0"
edition = "2021"

[dependencies]
janus_core = "0.1"
libloading = "0.7"  # 用于动态加载
  1. src/plugins/calculator/mod.rs:
pub mod basic;
pub mod advanced;
  1. src/plugins/calculator/basic.rs:
use janus_core::plugin::{Plugin, PluginMetadata};

pub trait CalculatorPlugin: Plugin {
    fn add(&self, a: i32, b: i32) -> i32;
    fn subtract(&self, a: i32, b: i32) -> i32;
}

pub struct BasicCalculator;

impl Plugin for BasicCalculator {
    fn metadata(&self) -> PluginMetadata {
        PluginMetadata {
            id: "basic_calculator".to_string(),
            name: "Basic Calculator".to_string(),
            version: "1.0.0".to_string(),
        }
    }
}

impl CalculatorPlugin for BasicCalculator {
    fn add(&self, a: i32, b: i32) -> i32 {
        a + b
    }
    
    fn subtract(&self, a: i32, b: i32) -> i32 {
        a - b
    }
}
  1. src/plugins/logger/mod.rs:
pub mod file_logger;
  1. src/plugins/logger/file_logger.rs:
use janus_core::plugin::{Plugin, PluginMetadata};
use janus_core::messaging::{Message, MessageBus};

pub struct FileLogger;

impl Plugin for FileLogger {
    fn metadata(&self) -> PluginMetadata {
        PluginMetadata {
            id: "file_logger".to_string(),
            name: "File Logger".to_string(),
            version: "1.0.0".to_string(),
        }
    }
}

impl FileLogger {
    pub fn setup_message_handler(&self, bus: &MessageBus) {
        bus.subscribe("log_message", |msg: &dyn Message| {
            if let Some(log_msg) = msg.as_any().downcast_ref::<LogMessage>() {
                println!("[File Logger] {}", log_msg.content);
            }
        });
    }
}

pub struct LogMessage {
    pub content: String,
}

impl Message for LogMessage {
    fn type_id(&self) -> &'static str {
        "log_message"
    }
}
  1. src/main.rs:
use janus_core::plugin_manager::PluginManager;
use janus_core::messaging::MessageBus;

mod plugins;

use plugins::calculator::basic::{BasicCalculator, CalculatorPlugin};
use plugins::logger::file_logger::{FileLogger, LogMessage};

fn main() {
    let mut manager = PluginManager::new();
    
    // 注册基本计算器插件
    manager.register_plugin(Box::new(BasicCalculator));
    
    // 注册文件日志插件
    let logger = FileLogger;
    logger.setup_message_handler(manager.message_bus());
    manager.register_plugin(Box::new(logger));
    
    // 使用计算器插件
    if let Some(calc) = manager.get_plugin::<dyn CalculatorPlugin>("basic_calculator") {
        println!("5 + 3 = {}", calc.add(5, 3));
        
        // 发送日志消息
        let bus = manager.message_bus();
        bus.send(LogMessage {
            content: format!("Calculated 5 + 3 = {}", calc.add(5, 3)),
        });
    }
}

这个完整示例展示了:

  1. 定义插件接口和实现
  2. 插件注册和管理
  3. 插件间通信
  4. 项目组织结构

janus_core为构建模块化Rust应用提供了坚实的基础,通过其灵活的插件系统,开发者可以创建可扩展、易维护的应用程序架构。

回到顶部