Files
hakorune/docs/private/ideas/improvements/2025-08-26-modular-builtin-box-system.md

3.6 KiB
Raw Blame History

モジュラービルトインBoxシステム

Status: Pending Created: 2025-08-26 Priority: Medium Related: ビルトインBox管理の柔軟性向上

現状の問題

  • ビルトインBoxは本体にハードコードされており、不要な機能も常に含まれる
  • プラグインBoxはWASMでは動作しない.so/.dll依存
  • 特殊用途のBoxMidnightBox等が常にビルドに含まれる

提案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")
}

利点

  1. バイナリサイズ削減: 必要な機能のみ含める
  2. ビルド時間短縮: 不要な依存関係を除外
  3. WASM対応: Rust WASM機能をフル活用可能
  4. 設定の柔軟性: ビルド時/実行時の両方で制御
  5. 後方互換性: 既存のコードは変更不要

使用例

// 条件付き実行
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の一覧