use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ToolType {
Mcp,
Function,
ClassMethod,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Header {
pub header_name: Option<String>,
pub header_value: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Auth {
pub headers: Option<Vec<Header>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpTypeStreamable {
pub url: String,
pub port: u16,
#[serde(default = "McpTypeStreamable::default_path")]
pub path: String,
pub auth: Option<Auth>,
}
impl McpTypeStreamable {
fn default_path() -> String { "/".to_string() }
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpTypeStdio {
pub command: String,
pub args: Vec<String>,
pub env: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum McpConfig {
Streamable(McpTypeStreamable),
Stdio(McpTypeStdio),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolConfigBase {
#[serde(rename = "type")]
pub tool_type: ToolType,
#[serde(default)]
pub name: String,
#[serde(default)]
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpToolConfig {
#[serde(flatten)]
pub base: ToolConfigBase,
pub mcp_config: McpConfig,
pub tool_filter: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionToolConfig {
#[serde(flatten)]
pub base: ToolConfigBase,
pub module_path: String,
pub function_name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClassMethodToolConfig {
#[serde(flatten)]
pub base: ToolConfigBase,
pub module_path: String,
pub class_name: String,
pub method_name: String,
#[serde(default)]
pub init_params: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ToolConfig {
Mcp(McpToolConfig),
Function(FunctionToolConfig),
ClassMethod(ClassMethodToolConfig),
}
impl ToolConfig {
pub fn name(&self) -> &str {
match self {
ToolConfig::Mcp(c) => &c.base.name,
ToolConfig::Function(c) => &c.base.name,
ToolConfig::ClassMethod(c) => &c.base.name,
}
}
pub fn tool_type(&self) -> &ToolType {
match self {
ToolConfig::Mcp(c) => &c.base.tool_type,
ToolConfig::Function(c) => &c.base.tool_type,
ToolConfig::ClassMethod(c) => &c.base.tool_type,
}
}
}