require 'stockboy/dsl'

module Stockboy

  # Abstract class for defining data readers
  #
  # == Interface
  #
  # A reader must implement a +parse+ method for extracting an array of records
  # from raw data. At this stage no data transformation is performed, only
  # extracting field tokens for each record, based on the specific data
  # serialization.
  #
  # String keys should be preferred, since these may be specified by the user;
  # external inputs should not be symbolized (because symbols are never GC'd).
  # Frozen strings for keys are a good idea, of course.
  #
  # @example
  #   reader.parse("name,email\nArthur Dent,[email protected]")
  #   # => [{"name" => "Arthur Dent", "email" => "[email protected]"}]
  #
  # @abstract
  #
  class Reader
    extend Stockboy::DSL

    attr_reader :encoding

    # Initialize a new reader
    #
    # @param [Hash] opts
    #
    def initialize(opts={})
      @encoding = opts.delete(:encoding)
    end

    # Take raw input (String) and extract an array of records
    #
    # @return [Array<Hash>]
    #
    def parse(data)
      raise NoMethodError, "#{self.class}#parse needs implementation"
    end

  end


  # @!macro [new] reader.skip_row_options
  # [skip_header_rows]
  #   If the file has a preamble before actual data to be ignored
  #     skip_header_rows 4
  # [skip_header_rows]
  #   If the file has a summary or footer to be ignored
  #     skip_footer_rows 4

  # @!macro [new] reader.encoding_options
  # [encoding]
  #   String encoding format of the source data. All readers output UTF-8.
  #     encoding 'Windows-1252'

end