Sha256: d3d8043b701577b28aef521f466045eb35f74c6504ccf44e7b95273a330dde00

Contents?: true

Size: 1.86 KB

Versions: 3

Compression:

Stored size: 1.86 KB

Contents

# frozen_string_literal: true

module ReciteCSV
  module Header
    module Definition
      class Base
        attr_reader :raw_definition

        def initialize(raw_definition)
          @raw_definition = raw_definition
        end

        def build_column_methods_module
          self.class::ColumnMethodsBuilder.new(self.raw_definition)
        end

        def default_csv_options
          {}.freeze
        end

        def self.new(*)
          if self == Base
            raise ::NotImplementedError,
                  "#{self} is an abstract class and cannot be instantiated."
          end
          super
        end
      end

      class Hash < Base
        DEFAULT_CSV_OPTIONS = { headers: :first_row }.freeze

        class ColumnMethodsBuilder < ::Module
          def initialize(raw_definition)
            raw_definition.each_pair do |method_name, header_name|
              define_method method_name do
                self[header_name]
              end
            end
          end
        end

        def default_csv_options
          DEFAULT_CSV_OPTIONS
        end
      end

      class Array < Base
        class ColumnMethodsBuilder < ::Module
          def initialize(raw_definition)
            raw_definition.each.with_index do |name, idx|
              next if name.nil? || name.empty?

              define_method name do
                self[idx]
              end
            end
          end
        end
      end

      DEFINITIONS = {
        ::Hash => Hash,
        ::Array => Array
      }.freeze

      module_function

      def dispatch(header_definition)
        _, definition_class = DEFINITIONS.find do |klass, _|
          header_definition.is_a? klass
        end
        unless definition_class
          raise ::ArgumentError, "Unexpected header definition type"
        end

        definition_class.new(header_definition)
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
recite_csv-2.0.0 lib/recite_csv/header/definition.rb
recite_csv-1.0.0 lib/recite_csv/header/definition.rb
recite_csv-0.2.0 lib/recite_csv/header/definition.rb