use async_trait::async_trait;
use serde_json::Value;
use crate::mcp::clients::helpscout::HelpscoutClientNode;
use crate::mcp::core::{error::WorkflowError, nodes::Node, task::TaskContext};
#[derive(Debug)]
pub struct HelpscoutSearchNode {
pub helpscout_client: Option<HelpscoutClientNode>,
}
impl Default for HelpscoutSearchNode {
fn default() -> Self {
Self {
helpscout_client: None,
}
}
}
impl HelpscoutSearchNode {
pub fn new() -> Self {
Self::default()
}
pub fn with_client(mut self, client: HelpscoutClientNode) -> Self {
self.helpscout_client = Some(client);
self
}
}
#[async_trait]
impl Node for HelpscoutSearchNode {
async fn execute(&self, input: Value, _context: &TaskContext) -> Result<Value, WorkflowError> {
let user_query = input
.get("user_query")
.or_else(|| input.get("event_data").and_then(|ed| ed.get("user_query")))
.and_then(|v| v.as_str())
.unwrap_or("");
let mock_results = serde_json::json!({
"source": "helpscout",
"query": user_query,
"results_found": 2,
"mock_data": true,
"articles": [
{
"title": "How to Guide",
"url": "https://helpscout.com/article1",
"relevance": 90
}
],
"conversations": [
{
"subject": "Similar Issue Resolved",
"url": "https://helpscout.com/conversation1",
"relevance": 78
}
]
});
Ok(serde_json::json!({
"helpscout_search_results": mock_results,
"helpscout_search_completed": true
}))
}
fn name(&self) -> &str {
"HelpscoutSearchNode"
}
}