Sha256: 29597a104e6892884c79b09100a4c9dfea1569cd0c6cacc1dc11e4594d3b0b5c

Contents?: true

Size: 1.34 KB

Versions: 1

Compression:

Stored size: 1.34 KB

Contents

# frozen_string_literal: true

module Grumlin
  module Shortcuts
    module InstanceMethods
      def with_shortcuts(obj)
        ShortcutProxy.new(obj, self.class.shortcuts, parent: self)
      end
    end

    def self.extended(base)
      base.include(InstanceMethods)
      base.include(Grumlin::Expressions)
    end

    def inherited(subclass)
      super
      subclass.shortcuts_from(self)
    end

    def shortcut(name, shortcut = nil, &block) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
      name = name.to_sym
      # TODO: blocklist of names to avoid conflicts with standard methods?
      if Grumlin::AnonymousStep::SUPPORTED_STEPS.include?(name)
        raise ArgumentError,
              "cannot use names of standard gremlin steps"
      end

      if (shortcut.nil? && block.nil?) || (shortcut && block)
        raise ArgumentError, "either shortcut or block must be passed"
      end

      shortcut ||= Shortcut.new(name, &block)

      raise ArgumentError, "shortcut '#{name}' already exists" if shortcuts.key?(name) && shortcuts[name] != shortcut

      shortcuts[name] = shortcut
    end

    def shortcuts_from(other_shortcuts)
      other_shortcuts.shortcuts.each do |name, shortcut|
        shortcut(name, shortcut)
      end
    end

    def shortcuts
      @shortcuts ||= {}
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
grumlin-0.15.6 lib/grumlin/shortcuts.rb