Skip to main content

stynx_code_bridge/application/
bridge_messaging.rs

1use 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}