# nyash.toml v2 仕様 - 究極のシンプル設計 > ⚠️ **PARTIALLY OUTDATED - 部分的に古い** > > この文書の基本構造は正しいですが、実際の形式と一部異なります。 > > **最新の実際の設定形式については、以下を参照してください:** > - [BID-FFI v1 実装仕様書](./bid-ffi-v1-actual-specification.md) - 現在動作中の仕様 > - [nyash.toml設定例](../../../../nyash.toml) - 実際の設定形式 ## 🎯 概要 **革命的シンプル設計**: nyash.toml中心アーキテクチャ + 最小限FFI ## 📝 nyash.toml v2形式 ### マルチBox型プラグイン対応 ```toml [libraries] # ライブラリ定義(1つのプラグインで複数のBox型を提供可能) "libnyash_filebox_plugin.so" = { boxes = ["FileBox"], path = "./target/release/libnyash_filebox_plugin.so" } # 将来の拡張例: 1つのプラグインで複数Box型 "libnyash_network_plugin.so" = { boxes = ["SocketBox", "HTTPServerBox", "HTTPClientBox"], path = "./target/release/libnyash_network_plugin.so" } # FileBoxの型情報定義 [libraries."libnyash_filebox_plugin.so".FileBox] type_id = 6 abi_version = 1 # ABIバージョンもここに! [libraries."libnyash_filebox_plugin.so".FileBox.methods] # method_id だけで十分(引数情報は実行時チェック) birth = { method_id = 0 } open = { method_id = 1 } read = { method_id = 2 } write = { method_id = 3 } close = { method_id = 4 } fini = { method_id = 4294967295 } # 0xFFFFFFFF ``` ## 🚀 究極のシンプルFFI ### プラグインが実装する関数 #### 必須: メソッド実行エントリーポイント ```c // 唯一の必須関数 - すべてのメソッド呼び出しはここから extern "C" fn nyash_plugin_invoke( type_id: u32, // Box型ID(例: FileBox = 6) method_id: u32, // メソッドID(0=birth, 0xFFFFFFFF=fini) instance_id: u32, // インスタンスID(0=static/birth) args: *const u8, // TLVエンコード引数 args_len: usize, result: *mut u8, // TLVエンコード結果バッファ result_len: *mut usize // [IN/OUT]バッファサイズ ) -> i32 // 0=成功, 負=エラー ``` #### オプション: グローバル初期化 ```c // プラグインロード時に1回だけ呼ばれる(実装は任意) extern "C" fn nyash_plugin_init() -> i32 { // グローバルリソースの初期化 // 設定ファイルの読み込み // ログファイルのオープン // 0=成功, 負=エラー(プラグインは無効化される) } ``` ### 廃止されたAPI ```c // ❌ これらは全部不要! nyash_plugin_abi_version() // → nyash.tomlのabi_version nyash_plugin_get_box_count() // → nyash.tomlのboxes配列 nyash_plugin_get_box_info() // → nyash.tomlから取得 NyashHostVtable // → 完全廃止! ``` ## 📊 設計原則 ### 1. **Single Source of Truth** - すべてのメタ情報はnyash.tomlに集約 - プラグインは純粋な実装のみ ### 2. **Zero Dependencies** - Host VTable廃止 = 依存関係ゼロ - プラグインは完全に独立 ### 3. **シンプルなライフサイクル** - `init` (オプション): プラグインロード時の初期化 - `birth` (method_id=0): インスタンス作成 - 各種メソッド: インスタンス操作 - `fini` (method_id=0xFFFFFFFF): 論理的終了 ### 4. **ログ出力** ```rust // プラグインは自己完結でログ出力 eprintln!("[FileBox] Opened: {}", path); // 標準エラー // または専用ログファイル let mut log = File::create("plugin_debug.log")?; writeln!(log, "{}: FileBox birth", chrono::Local::now())?; ``` ### 5. **init関数の活用例** ```rust static mut LOG_FILE: Option = None; #[no_mangle] pub extern "C" fn nyash_plugin_init() -> i32 { // ログファイルを事前に開く match File::create("filebox.log") { Ok(f) => { unsafe { LOG_FILE = Some(f); } 0 // 成功 } Err(_) => -1 // エラー → プラグイン無効化 } } ``` ## 🔧 実装の流れ ### Phase 1: nyash.toml v2パーサー 1. 新形式の読み込み 2. Box型情報の抽出 3. メソッドID管理 ### Phase 2: プラグインローダー簡素化 1. `nyash_plugin_init`(オプション)と`nyash_plugin_invoke`(必須)をロード 2. nyash.tomlベースの型登録 3. Host VTable関連コードを削除 4. init関数が存在し失敗した場合はプラグインを無効化 ### Phase 3: プラグイン側の対応 1. abi/get_box_count/get_box_info関数を削除 2. init関数は必要に応じて実装(グローバル初期化) 3. invoke関数でメソッド処理 4. ログ出力を自己完結に ## 🎉 メリット 1. **究極のシンプルさ** - 基本的にFFI関数1つ(initはオプション) 2. **保守性向上** - 複雑な相互依存なし 3. **テスト容易性** - モック不要 4. **移植性** - どの言語でも実装可能 5. **拡張性** - nyash.toml編集で機能追加 6. **初期化保証** - init関数で早期エラー検出可能 ## 🚨 注意事項 - プラグインのログは標準エラー出力かファイル出力で - メモリ管理はプラグイン内で完結 - 非同期処理はNyash側でFutureBoxラップ --- **革命完了**: これ以上シンプルにできない究極の設計!