delonnewman/dragnet

View on GitHub
lib/dragnet/command/result.rb

Summary

Maintainability
A
1 hr
Test Coverage
# frozen_string_literal: true

module Dragnet
  class Command::Result
    attr_reader :error

    def initialize
      @failure = false
      @stash = {}
    end

    def finalize!
      freeze
      @stash.freeze
      @error.freeze
      self
    end

    def failure!(message)
      @error = message
      @failure = true
    end

    def failure?
      @failure
    end

    def successful?
      !failure?
    end

    private

    def method_missing(method_name, *args)
      if method_name.name.end_with?('=')
        raise ArgumentError, "wrong number of arguments expected 1, got #{args.length}" unless args.length == 1

        @stash[method_name.name.chop.to_sym] = args.first
        return
      end

      raise ArgumentError, "wrong number of arguments expected 0, got #{args.length}" unless args.empty?

      if method_name.name.end_with?('?')
        !!@stash[method_name.name.chop.to_sym]
      else
        super unless @stash.key?(method_name)

        @stash[method_name]
      end
    end

    def respond_to_missing?(method_name, include_all)
      name = method_name.name
      return true if name.end_with?('=', '?')

      @stash.key?(method_name) || super
    end
  end
end