Sha256: eab593ad8a629251c25bbc4772d2a2878d3e676ce8a3405dec0b00a3489a330f

Contents?: true

Size: 1.43 KB

Versions: 3

Compression:

Stored size: 1.43 KB

Contents

require 'synchronisable/input_descriptor'

module Synchronisable
  # Responsible for guessing the user input format.
  #
  # @api private
  class InputParser
    def initialize(model, synchronizer)
      @model = model
      @synchronizer = synchronizer
    end

    # Parses the user input.
    #
    # @param data [Array<Hash>, Array<String>, Array<Integer>, String, Integer]
    #   synchronization data to handle.
    #
    # @return [Array<Hash>] array of hashes with remote attributes
    def parse(data)
      input = InputDescriptor.new(data)

      result = case
      when input.empty?
        @synchronizer.fetch
      when input.remote_id?
        @synchronizer.find(data)
      when input.local_id?
        find_by_local_id(data)
      when input.array_of_ids?
        find_by_array_of_ids(input)
      else
        result = data.dup
      end

      [result].flatten.compact
    end

    private

    def find_by_array_of_ids(input)
      records = find_imports(input.element_class.name, input.data)
      records.map { |r| @synchronizer.find(r.remote_id) }
    end

    def find_by_local_id(id)
      import = @model.find_by(id: id).try(:import)
      import ? @synchronizer.find(import.remote_id) : nil
    end

    def find_imports(class_name, ids)
      case class_name
      when 'Fixnum'
        ids.map { |id| @model.find_by(id: id).try(&:import) }
      when 'String'
        ids.map { |id| Import.find_by(id: id) }
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
synchronisable-1.0.2 lib/synchronisable/input_parser.rb
synchronisable-1.0.1 lib/synchronisable/input_parser.rb
synchronisable-1.0.0 lib/synchronisable/input_parser.rb