validateToolInput function
Validate tool input against schema.
Implementation
List<String> validateToolInput(String toolName, Map<String, dynamic> input) {
final schema = _schemas[toolName];
if (schema == null) return ['Unknown tool: $toolName'];
final inputSchema = schema['input_schema'] as Map<String, dynamic>? ?? {};
final required = (inputSchema['required'] as List?)?.cast<String>() ?? [];
final properties = inputSchema['properties'] as Map<String, dynamic>? ?? {};
final errors = <String>[];
// Check required fields
for (final field in required) {
if (!input.containsKey(field) || input[field] == null) {
errors.add('Missing required field: $field');
}
}
// Type checking
for (final entry in input.entries) {
final prop = properties[entry.key] as Map<String, dynamic>?;
if (prop == null) continue; // Extra fields are ok
final expectedType = prop['type'] as String?;
if (expectedType != null) {
final valid = switch (expectedType) {
'string' => entry.value is String,
'number' => entry.value is num,
'boolean' => entry.value is bool,
'array' => entry.value is List,
'object' => entry.value is Map,
_ => true,
};
if (!valid) {
errors.add(
'Field "${entry.key}" expected $expectedType but got ${entry.value.runtimeType}',
);
}
}
// Enum validation
final enumValues = prop['enum'] as List?;
if (enumValues != null && !enumValues.contains(entry.value)) {
errors.add(
'Field "${entry.key}" must be one of: ${enumValues.join(", ")}',
);
}
}
return errors;
}