rggen/rggen-core

View on GitHub
lib/rggen/core/base/feature_layer_extension.rb

Summary

Maintainability
A
50 mins
Test Coverage
# frozen_string_literal: true

module RgGen
  module Core
    module Base
      module FeatureLayerExtension
        private

        module Common
          def root?
            @component.root?
          end

          def register_block?
            @component.register_block?
          end

          def register_file?
            @component.register_file?
          end

          def register?
            @component.register?
          end

          def bit_field?
            @component.bit_field?
          end
        end

        module Root
          include Common

          def root
            @component
          end
        end

        module RegisterBlock
          include Common

          def root
            register_block.root
          end

          def register_block
            @component
          end

          def register_blocks
            root.register_blocks
          end
        end

        module RegisterFile
          include Common

          def root
            register_file.root
          end

          def register_block
            register_file.register_block
          end

          def block_or_file
            register_file.block_or_file
          end

          def register_file(layer = nil)
            layer == :upper ? @component.register_file : @component
          end

          def files_and_registers
            block_or_file.files_and_registers
          end
        end

        module Register
          include Common

          def root
            register.root
          end

          def register_block
            register.register_block
          end

          def register_file
            register.register_file
          end

          def register_files
            register.register_files
          end

          def block_or_file
            register.block_or_file
          end

          def register
            @component
          end

          def files_and_registers
            block_or_file.files_and_registers
          end
        end

        module BitField
          include Common

          def root
            bit_field.root
          end

          def register_block
            bit_field.register_block
          end

          def register_file
            bit_field.register_file
          end

          def register_files
            bit_field.register_files
          end

          def register
            bit_field.register
          end

          def bit_field
            @component
          end

          def bit_fields
            register.bit_fields
          end
        end

        ACCESSOR_EXTENSIONS = {
          root: Root,
          register_block: RegisterBlock,
          register_file: RegisterFile,
          register: Register,
          bit_field: BitField
        }.freeze

        def define_layer_methods
          ACCESSOR_EXTENSIONS.key?(component.layer) &&
            (extend ACCESSOR_EXTENSIONS[component.layer])
        end
      end
    end
  end
end