Sha256: e63b0d4f89562de48d333936fb2ed384e0f4a9734582aaee698d32658aee0b73

Contents?: true

Size: 1.96 KB

Versions: 3

Compression:

Stored size: 1.96 KB

Contents

module ImageProcessing
  module Chainable
    def source(file)
      branch source: file
    end

    def convert(format)
      branch format: format
    end

    def loader(**options)
      branch loader: options
    end

    def saver(**options)
      branch saver: options
    end

    def custom(&block)
      operation :custom, block
    end

    def apply(operations)
      operations.inject(self) do |builder, (name, argument)|
        if argument == true || argument == nil
          builder.send(name)
        elsif argument.is_a?(Array)
          builder.send(name, *argument)
        else
          builder.send(name, argument)
        end
      end
    end

    def method_missing(name, *args)
      return super if name.to_s.end_with?("?")
      return send(name.to_s.chomp("!"), *args).call if name.to_s.end_with?("!")

      operation name, *args
    end

    def operation(name, *args)
      branch operations: [[name, args]]
    end

    def call(file = nil, destination: nil, **call_options)
      options = {}
      options = options.merge(source: file) if file
      options = options.merge(destination: destination) if destination

      branch(options).call!(**call_options)
    end

    def branch(loader: nil, saver: nil, operations: nil, **other_options)
      options = respond_to?(:options) ? self.options : DEFAULT_OPTIONS

      options = options.merge(loader: options[:loader].merge(loader)) if loader
      options = options.merge(saver: options[:saver].merge(saver)) if saver
      options = options.merge(operations: options[:operations] + operations) if operations
      options = options.merge(processor_class: self::Processor) unless self.is_a?(Builder)
      options = options.merge(other_options)

      options.freeze

      Builder.new(options)
    end

    DEFAULT_OPTIONS = {
      source:          nil,
      loader:          {},
      saver:           {},
      format:          nil,
      operations:      [],
      processor_class: nil,
    }.freeze
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
image_processing-1.4.0 lib/image_processing/chainable.rb
image_processing-1.3.0 lib/image_processing/chainable.rb
image_processing-1.2.0 lib/image_processing/chainable.rb