aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/cli/search.rb
blob: 5c57ba43da92865f022829cb3883f6c05b4af833 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Hbc::CLI::Search < Hbc::CLI::Base
  def self.run(*arguments)
    render_results(*search(*arguments))
  end

  def self.extract_regexp(string)
    if string =~ %r{^/(.*)/$}
      Regexp.last_match[1]
    else
      false
    end
  end

  def self.search(*arguments)
    exact_match = nil
    partial_matches = []
    search_term = arguments.join(" ")
    search_regexp = extract_regexp arguments.first
    all_tokens = Hbc::CLI.nice_listing(Hbc.all_tokens)
    if search_regexp
      search_term = arguments.first
      partial_matches = all_tokens.grep(%r{#{search_regexp}}i)
    else
      simplified_tokens = all_tokens.map { |t| t.sub(%r{^.*\/}, "").gsub(%r{[^a-z0-9]+}i, "") }
      simplified_search_term = search_term.sub(%r{\.rb$}i, "").gsub(%r{[^a-z0-9]+}i, "")
      exact_match = simplified_tokens.grep(%r{^#{simplified_search_term}$}i) { |t| all_tokens[simplified_tokens.index(t)] }.first
      partial_matches = simplified_tokens.grep(%r{#{simplified_search_term}}i) { |t| all_tokens[simplified_tokens.index(t)] }
      partial_matches.delete(exact_match)
    end
    [exact_match, partial_matches, search_term]
  end

  def self.render_results(exact_match, partial_matches, search_term)
    if !exact_match && partial_matches.empty?
      puts "No Cask found for \"#{search_term}\"."
      return
    end
    if exact_match
      ohai "Exact match"
      puts exact_match
    end
    unless partial_matches.empty?
      if extract_regexp search_term
        ohai "Regexp matches"
      else
        ohai "Partial matches"
      end
      puts_columns partial_matches
    end
  end

  def self.help
    "searches all known Casks"
  end
end