findSimilar method

List<ToolRegistration> findSimilar(
  1. String query
)

Find tools whose names are similar to query (case-insensitive prefix and substring matching).

Implementation

List<ToolRegistration> findSimilar(String query) {
  if (query.isEmpty) return [];
  final q = query.toLowerCase();

  // Exact match first.
  final exact = _tools[query];
  if (exact != null) return [exact];

  // Prefix matches.
  final prefixMatches = _tools.values
      .where((r) => r.name.toLowerCase().startsWith(q))
      .toList();
  if (prefixMatches.isNotEmpty) return prefixMatches;

  // Substring matches.
  final substringMatches = _tools.values
      .where((r) => r.name.toLowerCase().contains(q))
      .toList();
  if (substringMatches.isNotEmpty) return substringMatches;

  // Levenshtein-based fuzzy (simple edit distance for short names).
  final scored = <(ToolRegistration, int)>[];
  for (final reg in _tools.values) {
    final dist = _editDistance(q, reg.name.toLowerCase());
    if (dist <= 3) {
      scored.add((reg, dist));
    }
  }
  scored.sort((a, b) => a.$2.compareTo(b.$2));
  return scored.map((e) => e.$1).toList();
}