use saya_agent::ToolError;
use super::definitions::MAX_TERMS;
pub(super) fn validate_arguments(
name: &str,
arguments: &serde_json::Value,
) -> Result<(), ToolError> {
let object = arguments.as_object().ok_or(ToolError::ArgumentsNotObject)?;
let allowed = match name {
"contract_search" => &["connection", "terms"][..],
"contract_read" => &["connection", "table"][..],
_ => return Err(ToolError::UnsupportedTool),
};
if object.keys().any(|key| !allowed.contains(&key.as_str())) {
return Err(ToolError::UnsupportedProperty);
}
if object
.get("connection")
.is_some_and(|connection| !connection.is_string())
{
return Err(ToolError::ConnectionNotString);
}
match name {
"contract_search" => validate_terms(object.get("terms")),
"contract_read" => validate_table(object.get("table")),
_ => Err(ToolError::UnsupportedTool),
}
}
fn validate_terms(terms: Option<&serde_json::Value>) -> Result<(), ToolError> {
let Some(terms) = terms else {
return Ok(());
};
let array = terms.as_array().ok_or(ToolError::InvalidQueryArguments)?;
if array.len() > MAX_TERMS {
return Err(ToolError::InvalidQueryArguments);
}
if !array.iter().all(serde_json::Value::is_string) {
return Err(ToolError::InvalidQueryArguments);
}
Ok(())
}
fn validate_table(table: Option<&serde_json::Value>) -> Result<(), ToolError> {
match table {
Some(value) if value.is_string() => Ok(()),
_ => Err(ToolError::InvalidQueryArguments),
}
}