Sha256: 2837ce5431c0ce2528b5272b07a97041f1f6ce66601c4cdea3d7550539e824fb

Contents?: true

Size: 1.45 KB

Versions: 3

Compression:

Stored size: 1.45 KB

Contents

module ReeActions
  module DSL
    def self.included(base)
      base.extend(ClassMethods)
      base.include(ReeMapper::DSL)
    end

    def self.extended(base)
      base.extend(ClassMethods)
      base.include(ReeMapper::DSL)
    end

    module ClassMethods
      include Ree::Contracts::Core
      include Ree::Contracts::ArgContracts

      def action(name, &proc)
        dsl = Ree::ObjectDsl.new(
          Ree.container.packages_facade, name, self, :fn
        )

        dsl.instance_exec(&proc) if block_given?
        dsl.tags(["action"])
        dsl.freeze(false)
        dsl.object.set_as_compiled(false)

        Ree.container.compile(dsl.package, name)
      end

      def method_added(method_name)
        return super if method_name != :call

        if @__original_call_defined
          remove_instance_variable(:@__original_call_defined)
          return
        end

        @__original_call_defined = true

        alias_method(:__original_call, :call)

        define_method :call do |user_access, attrs|
          if self.class.const_defined?(:ActionCaster)
            caster = self.class.const_get(:ActionCaster)

            if !caster.respond_to?(:cast)
              raise ArgumentError.new("ActionCaster does not respond to `cast` method")
            end

            __original_call(user_access, caster.cast(attrs))
          else
            __original_call(user_access, attrs)
          end
        end

        nil
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ree_lib-1.0.42 lib/ree_lib/packages/ree_actions/package/ree_actions/dsl.rb
ree_lib-1.0.41 lib/ree_lib/packages/ree_actions/package/ree_actions/dsl.rb
ree_lib-1.0.40 lib/ree_lib/packages/ree_actions/package/ree_actions/dsl.rb