class Dry::Logic::Operations::Key

def self.evaluator(name)

def self.evaluator(name)
  Evaluator::Key.new(name)
end

def self.new(rules, **options)

def self.new(rules, **options)
  if options[:evaluator]
    super
  else
    name = options.fetch(:name)
    eval = options.fetch(:evaluator, evaluator(name))
    super(rules, **options, evaluator: eval, path: name)
  end
end

def [](hash)

def [](hash)
  rule[evaluator[hash]]
end

def ast(input = Undefined)

def ast(input = Undefined)
  if input.equal?(Undefined) || !input.is_a?(Hash)
    [type, [path, rule.ast]]
  else
    [type, [path, rule.ast(evaluator[input])]]
  end
end

def call(hash)

def call(hash)
  input = evaluator[hash]
  result = rule.(input)
  if result.success?
    Result::SUCCESS
  else
    Result.new(false, path) { [type, [path, result.to_ast]] }
  end
end

def initialize(*rules, **options)

def initialize(*rules, **options)
  super
  @evaluator = options[:evaluator]
  @path = options[:path]
end

def to_s

def to_s
  "#{type}[#{path}](#{rule})"
end

def type

def type
  :key
end