stynx_code_bridge/application/
bridge_messaging.rs1use async_trait::async_trait;
2use stynx_code_errors::AppResult;
3use crate::domain::bridge_types::{BridgeError, BridgeMessage, BridgeMethod};
4
5#[async_trait]
6pub trait BridgeMessageHandler: Send + Sync {
7 async fn handle_message(&self, msg: BridgeMessage) -> AppResult<BridgeMessage>;
8}
9
10pub struct DefaultBridgeHandler;
11
12#[async_trait]
13impl BridgeMessageHandler for DefaultBridgeHandler {
14 async fn handle_message(&self, msg: BridgeMessage) -> AppResult<BridgeMessage> {
15 match msg {
16 BridgeMessage::Request { id, method, params } => {
17 tracing::debug!(?method, "handling bridge request");
18 let result = match method {
19 BridgeMethod::Execute => {
20 tracing::info!("execute request received");
21 serde_json::json!({ "status": "accepted", "params": params })
22 }
23 BridgeMethod::Cancel => {
24 tracing::info!("cancel request received");
25 serde_json::json!({ "status": "cancelled" })
26 }
27 BridgeMethod::GetStatus => {
28 serde_json::json!({ "status": "running" })
29 }
30 BridgeMethod::PermissionPrompt => {
31 serde_json::json!({ "approved": true })
32 }
33 BridgeMethod::ToolResult => {
34 serde_json::json!({ "status": "received" })
35 }
36 BridgeMethod::SetContext => {
37 serde_json::json!({ "status": "ok" })
38 }
39 };
40 Ok(BridgeMessage::Response {
41 id,
42 result: Some(result),
43 error: None,
44 })
45 }
46 BridgeMessage::Notification { method, .. } => {
47 tracing::debug!(method, "received notification (no response)");
48 Ok(BridgeMessage::Response {
49 id: String::new(),
50 result: None,
51 error: None,
52 })
53 }
54 BridgeMessage::Response { id, .. } => {
55 tracing::warn!(id, "received unexpected response message");
56 Ok(BridgeMessage::Response {
57 id,
58 result: None,
59 error: Some(BridgeError {
60 code: -32600,
61 message: "unexpected response message".into(),
62 }),
63 })
64 }
65 }
66 }
67}