taichi-ishitani/rggen

View on GitHub
lib/rggen/core_components/register_map/generic_map.rb

Summary

Maintainability
A
0 mins
Test Coverage
module RgGen
  module RegisterMap
    class GenericMap
      class Cell
        Position  = Struct.new(:file, :sheet, :row, :column) do
          def to_s
            [
              "file: #{file}",
              "sheet: #{sheet}",
              "row: #{row}",
              "column: #{column}"
            ].join(' ')
          end
        end

        def initialize(file, sheet, row, column)
          @position = Position.new(file, sheet, row, column)
        end

        attr_accessor :value
        attr_reader   :position

        def empty?
          return true if value.nil?
          return false unless value.respond_to?(:empty?)
          value.empty?
        end
      end

      class Sheet
        def initialize(file, name)
          @file = file
          @name = name
          @rows = []
        end

        attr_reader :name
        attr_reader :rows

        def [](row, column)
          rows[row]         ||= []
          rows[row][column] ||= Cell.new(@file, name, row, column)
        end

        def []=(row, column, value)
          self[row, column].value = value
        end
      end

      def initialize(file)
        @file   = file
        @sheets = {}
      end

      attr_reader :file

      def [](sheet_name_or_index)
        case sheet_name_or_index
        when String
          @sheets[sheet_name_or_index]  ||= Sheet.new(file, sheet_name_or_index)
        when Integer
          sheets[sheet_name_or_index]
        end
      end

      def []=(sheet_name, table)
        @sheets[sheet_name] = Sheet.new(file, sheet_name)
        table.each_with_index do |values, row|
          values.each_with_index do |value, column|
            @sheets[sheet_name][row, column]  = value
          end
        end
      end

      def sheets
        @sheets.values
      end
    end
  end
end