validateToolInput function

List<String> validateToolInput(
  1. String toolName,
  2. Map<String, dynamic> input
)

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;
}