3.6 KiB
3.6 KiB
モジュラービルトインBoxシステム
Status: Pending Created: 2025-08-26 Priority: Medium Related: ビルトインBox管理の柔軟性向上
現状の問題
- ビルトインBoxは本体にハードコードされており、不要な機能も常に含まれる
- プラグインBoxはWASMでは動作しない(.so/.dll依存)
- 特殊用途のBox(MidnightBox等)が常にビルドに含まれる
提案:3層アーキテクチャ
┌─────────────────────────────────────┐
│ Core Builtin Boxes │ ← 絶対必要(String, Integer等)
├─────────────────────────────────────┤
│ Optional Builtin Modules │ ← 条件付きコンパイル(MidnightBox等)
├─────────────────────────────────────┤
│ Plugin Boxes (BID) │ ← 外部プラグイン(FileBox等)
└─────────────────────────────────────┘
実装案
1. BuiltinModuleトレイト
pub trait BuiltinModule: Send + Sync {
fn name(&self) -> &'static str;
fn create_box(&self, args: Vec<Box<dyn NyashBox>>) -> Option<Box<dyn NyashBox>>;
fn required_features(&self) -> Vec<&'static str> { vec![] }
}
pub struct BuiltinModuleRegistry {
modules: HashMap<String, Box<dyn BuiltinModule>>,
enabled: HashSet<String>,
}
2. 設定ファイルベース管理
# nyash.toml
[builtin_modules]
core = ["StringBox", "IntegerBox", "BoolBox", "ArrayBox", "MapBox"]
[builtin_modules.optional]
midnight = { enabled = true, features = ["testnet"] }
egui = { enabled = false }
webcanvas = { enabled = true, target = "wasm32" }
3. Cargo features統合
[features]
default = ["core-boxes"]
# オプショナルモジュール
builtin-midnight = ["web-sys", "js-sys", "wasm-bindgen"]
builtin-egui = ["egui", "eframe"]
builtin-webcanvas = ["web-sys/CanvasRenderingContext2d"]
# プリセット
full = ["builtin-midnight", "builtin-egui", "builtin-webcanvas", "plugins"]
minimal = ["core-boxes"]
wasm-web = ["core-boxes", "builtin-webcanvas", "builtin-midnight"]
4. 動的登録マクロ
builtin_module! {
MidnightModule,
condition = cfg!(feature = "builtin-midnight")
}
利点
- バイナリサイズ削減: 必要な機能のみ含める
- ビルド時間短縮: 不要な依存関係を除外
- WASM対応: Rust WASM機能をフル活用可能
- 設定の柔軟性: ビルド時/実行時の両方で制御
- 後方互換性: 既存のコードは変更不要
使用例
// 条件付き実行
if hasBox("MidnightBox") {
local voting = new VotingApp()
voting.run()
} else {
print("MidnightBox is not available in this build")
}
ビルドコマンド例
# 最小構成
cargo build --release
# Midnight対応版
cargo build --release --features builtin-midnight
# フル機能版
cargo build --release --features full
# WASM Web版
cargo build --target wasm32-unknown-unknown --features wasm-web
実装タイミング
- Phase 10以降の最適化フェーズで検討
- プラグインシステムの成熟後に実装
- パフォーマンス問題が顕在化した場合に優先度上げ
関連課題
- プラグインシステムとの統合
- 設定ファイル管理の標準化
- ドキュメント自動生成(有効なBoxの一覧)