Files
hakorune/src/interpreter/methods/p2p_methods.rs
Moe Charm 3876b83e26 🚀 feat: NewP2PBox天才アルゴリズム完全実装 - P2P通信革命達成
## 🧠 天才アルゴリズム実装
- ローカル配送: MessageBus経由(爆速)
- リモート配送: Transport経由(柔軟)
- 完全自動判別・透明処理

## 📡 実装完了機能
1. NewP2PBox本体(天才アルゴリズム内蔵)
2. MessageBusシングルトン(高速ローカル配送)
3. Transport trait抽象化(InProcess/WebSocket/WebRTC)
4. MethodBox統合(Nyash側コールバック)
5. インタープリター完全統合

##  動作確認済み
- Rustクロージャ版: 全機能完璧動作
- MethodBox統合: コールバック正常動作
- インタープリター統合: Nyashから直接利用可能

## 🎯 利用可能Nyash構文
```nyash
alice = new NewP2PBox("alice", "InProcess")
msg = new MessageIntentBox("greeting")
msg.set("text", "Hello\!")
alice.send("bob", msg)
bob.onMethod("greeting", handler)
```

🎉 NyaMeshP2Pライブラリの基盤完成!次はP2PBoxデリゲート実装へ

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-11 17:51:16 +09:00

257 lines
10 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*! 📡 P2P通信メソッド実装
* IntentBoxとP2PBoxのNyashインタープリター統合
*/
use crate::interpreter::core::NyashInterpreter;
use crate::interpreter::core::RuntimeError;
use crate::ast::ASTNode;
use crate::box_trait::{NyashBox, StringBox};
use crate::boxes::{IntentBox, P2PBox, NewP2PBox, MessageIntentBox};
use crate::method_box::MethodBox;
impl NyashInterpreter {
/// IntentBoxのメソッド実行
pub(in crate::interpreter) fn execute_intent_box_method(
&mut self,
intent_box: &IntentBox,
method: &str,
_arguments: &[ASTNode],
) -> Result<Box<dyn NyashBox>, RuntimeError> {
match method {
// 基本情報取得
"getType" | "type" => {
Ok(Box::new(StringBox::new("IntentBox")))
}
// メッセージ処理(テスト用)
"processMessages" => {
let messages = intent_box.process_messages();
Ok(Box::new(StringBox::new(format!("Processed {} messages", messages.len()))))
}
_ => Err(RuntimeError::UndefinedVariable {
name: format!("IntentBox method '{}' not found", method),
})
}
}
/// P2PBoxのメソッド実行
pub(in crate::interpreter) fn execute_p2p_box_method(
&mut self,
p2p_box: &P2PBox,
method: &str,
arguments: &[ASTNode],
) -> Result<Box<dyn NyashBox>, RuntimeError> {
match method {
// ードID取得
"getNodeId" | "getId" => {
Ok(Box::new(StringBox::new(p2p_box.get_node_id())))
}
// メッセージ送信
"send" => {
if arguments.len() < 3 {
return Err(RuntimeError::InvalidOperation {
message: "send requires 3 arguments: intent, data, target".to_string(),
});
}
let intent = self.execute_expression(&arguments[0])?;
let data = self.execute_expression(&arguments[1])?;
let target = self.execute_expression(&arguments[2])?;
if let Some(intent_str) = intent.as_any().downcast_ref::<StringBox>() {
if let Some(target_str) = target.as_any().downcast_ref::<StringBox>() {
return Ok(p2p_box.send(&intent_str.value, data, &target_str.value));
}
}
Err(RuntimeError::TypeError {
message: "send requires string arguments for intent and target".to_string(),
})
}
// リスナー登録
"on" => {
if arguments.len() < 2 {
return Err(RuntimeError::InvalidOperation {
message: "on requires 2 arguments: intent, callback".to_string(),
});
}
let intent = self.execute_expression(&arguments[0])?;
let callback = self.execute_expression(&arguments[1])?;
if let Some(intent_str) = intent.as_any().downcast_ref::<StringBox>() {
return Ok(p2p_box.on(&intent_str.value, callback));
}
Err(RuntimeError::TypeError {
message: "on requires string argument for intent".to_string(),
})
}
// リスナー解除
"off" => {
if arguments.is_empty() {
return Err(RuntimeError::InvalidOperation {
message: "off requires 1 argument: intent".to_string(),
});
}
let intent = self.execute_expression(&arguments[0])?;
if let Some(intent_str) = intent.as_any().downcast_ref::<StringBox>() {
return Ok(p2p_box.off(&intent_str.value));
}
Err(RuntimeError::TypeError {
message: "off requires string argument for intent".to_string(),
})
}
_ => Err(RuntimeError::UndefinedVariable {
name: format!("P2PBox method '{}' not found", method),
})
}
}
/// NewP2PBoxのメソッド実行天才アルゴリズム版
pub(in crate::interpreter) fn execute_new_p2p_box_method(
&mut self,
p2p_box: &NewP2PBox,
method: &str,
arguments: &[ASTNode],
) -> Result<Box<dyn NyashBox>, RuntimeError> {
match method {
// ードID取得
"getNodeId" | "getId" => {
Ok(Box::new(StringBox::new(p2p_box.get_node_id())))
}
// メッセージ送信(天才アルゴリズム)
"send" => {
if arguments.len() != 2 {
return Err(RuntimeError::InvalidOperation {
message: "send requires 2 arguments: target, message_intent_box".to_string(),
});
}
let target = self.execute_expression(&arguments[0])?;
let message_box = self.execute_expression(&arguments[1])?;
if let Some(target_str) = target.as_any().downcast_ref::<StringBox>() {
if let Some(intent_box) = message_box.as_any().downcast_ref::<MessageIntentBox>() {
match p2p_box.send(&target_str.value, intent_box) {
Ok(()) => Ok(Box::new(StringBox::new("sent"))),
Err(e) => Err(RuntimeError::InvalidOperation { message: e }),
}
} else {
Err(RuntimeError::TypeError {
message: "send requires MessageIntentBox as second argument".to_string(),
})
}
} else {
Err(RuntimeError::TypeError {
message: "send requires string target as first argument".to_string(),
})
}
}
// リスナー登録MethodBox版
"onMethod" => {
if arguments.len() != 2 {
return Err(RuntimeError::InvalidOperation {
message: "onMethod requires 2 arguments: intent, method_box".to_string(),
});
}
let intent = self.execute_expression(&arguments[0])?;
let method_box = self.execute_expression(&arguments[1])?;
if let Some(intent_str) = intent.as_any().downcast_ref::<StringBox>() {
if let Some(method_box) = method_box.as_any().downcast_ref::<MethodBox>() {
match p2p_box.on_method(&intent_str.value, method_box.clone()) {
Ok(()) => Ok(Box::new(StringBox::new("listener registered"))),
Err(e) => Err(RuntimeError::InvalidOperation { message: e }),
}
} else {
Err(RuntimeError::TypeError {
message: "onMethod requires MethodBox as second argument".to_string(),
})
}
} else {
Err(RuntimeError::TypeError {
message: "onMethod requires string intent as first argument".to_string(),
})
}
}
_ => Err(RuntimeError::UndefinedVariable {
name: format!("NewP2PBox method '{}' not found", method),
})
}
}
/// MessageIntentBoxのメソッド実行
pub(in crate::interpreter) fn execute_message_intent_box_method(
&mut self,
message_box: &mut MessageIntentBox,
method: &str,
arguments: &[ASTNode],
) -> Result<Box<dyn NyashBox>, RuntimeError> {
match method {
// intent取得
"getIntent" | "intent" => {
Ok(Box::new(StringBox::new(&message_box.intent)))
}
// データ設定
"set" => {
if arguments.len() != 2 {
return Err(RuntimeError::InvalidOperation {
message: "set requires 2 arguments: key, value".to_string(),
});
}
let key = self.execute_expression(&arguments[0])?;
let value = self.execute_expression(&arguments[1])?;
if let Some(key_str) = key.as_any().downcast_ref::<StringBox>() {
message_box.set(&key_str.value, value);
Ok(Box::new(StringBox::new("set")))
} else {
Err(RuntimeError::TypeError {
message: "set requires string key as first argument".to_string(),
})
}
}
// データ取得
"get" => {
if arguments.len() != 1 {
return Err(RuntimeError::InvalidOperation {
message: "get requires 1 argument: key".to_string(),
});
}
let key = self.execute_expression(&arguments[0])?;
if let Some(key_str) = key.as_any().downcast_ref::<StringBox>() {
if let Some(value) = message_box.get(&key_str.value) {
Ok(value.clone_box())
} else {
Ok(Box::new(crate::boxes::NullBox::new()))
}
} else {
Err(RuntimeError::TypeError {
message: "get requires string key as argument".to_string(),
})
}
}
_ => Err(RuntimeError::UndefinedVariable {
name: format!("MessageIntentBox method '{}' not found", method),
})
}
}
}