Sha256: cf1f7ab1d5a2628b813d6934de7e4f4666cc122da1574d905cb046cea94712ac

Contents?: true

Size: 1.65 KB

Versions: 7

Compression:

Stored size: 1.65 KB

Contents

require 'commands/base'

module Dreamy
  module Command
    class InvalidCommand < RuntimeError; end
    class CommandFailed  < RuntimeError; end
    class Unauthorized   < RuntimeError; end

    class << self
      def run(command, args, retries=0)
        run_internal(command, args)
      rescue InvalidCommand
        error "Unknown command. Run 'dh help' for usage information."
      rescue Unauthorized
        if retries < 3
          STDERR.puts "Authentication failure"
          run(command, args, retries+1)
        else
          error "Authentication failure"
        end
      rescue CommandFailed => e
        error e.message
      rescue Interrupt => e
        error "\n[canceled]"
      end

      def run_internal(command, args)
        namespace, command = parse(command)
        require "commands/#{namespace}"
        klass = Dreamy::Command.const_get(namespace.capitalize).new(args)
        raise InvalidCommand unless klass.respond_to?(command)
        klass.send(command)
      end

      def error(msg)
        STDERR.puts(msg)
        exit 1
      end

      def parse(command)
        parts = command.split(':')
        case parts.size
        when 1
          if namespaces.include? command
            return command, 'index'
          else
            raise InvalidCommand
          end
        when 2
          raise InvalidCommand unless namespaces.include? parts[0]
          return parts
        else
          raise InvalidCommand
        end
      end

      def namespaces
        @@namespaces ||= Dir["#{File.dirname(__FILE__)}/commands/*"].map do |namespace|
          namespace.gsub(/.*\//, '').gsub(/\.rb/, '')
        end
      end

    end

  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
sant0sk1-dreamy-0.1.1 lib/dreamy/command.rb
sant0sk1-dreamy-0.1.2 lib/dreamy/command.rb
sant0sk1-dreamy-0.2.0 lib/dreamy/command.rb
sant0sk1-dreamy-0.2.1 lib/dreamy/command.rb
sant0sk1-dreamy-0.2.2 lib/dreamy/command.rb
sant0sk1-dreamy-0.2.3 lib/dreamy/command.rb
sant0sk1-dreamy-0.2.4 lib/dreamy/command.rb