aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb
blob: 001a9623b2a75c76cdf0e493ae03e0b4dfb72259 (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
require_relative "options"

module Hbc
  class CLI
    class AbstractCommand
      include Options

      option "--[no-]binaries", :binaries,      true
      option "--debug",         :debug,         false
      option "--verbose",       :verbose,       false
      option "--outdated",      :outdated_only, false
      option "--require-sha",   :require_sha, false

      def self.command_name
        @command_name ||= name.sub(/^.*:/, "").gsub(/(.)([A-Z])/, '\1_\2').downcase
      end

      def self.abstract?
        name.split("::").last.match?(/^Abstract[^a-z]/)
      end

      def self.visible
        true
      end

      def self.help
        nil
      end

      def self.needs_init?
        false
      end

      def self.run(*args)
        new(*args).run
      end

      attr_accessor :args
      private :args=

      def initialize(*args)
        @args = process_arguments(*args)
      end

      private

      def casks(alternative: -> { [] })
        return @casks if defined?(@casks)
        casks = args.empty? ? alternative.call : args
        @casks = casks.map { |cask| CaskLoader.load(cask) }
      rescue CaskUnavailableError => e
        reason = [e.reason, suggestion_message(e.token)].join(" ")
        raise e.class.new(e.token, reason)
      end

      def suggestion_message(cask_token)
        exact_match, partial_matches = Search.search(cask_token)

        if exact_match.nil? && partial_matches.count == 1
          exact_match = partial_matches.first
        end

        if exact_match
          "Did you mean “#{exact_match}”?"
        elsif !partial_matches.empty?
          "Did you mean one of these?\n"
            .concat(Formatter.columns(partial_matches.take(20)))
        else
          ""
        end
      end
    end
  end
end