medcat/breadcrumb_trail

View on GitHub
lib/breadcrumb_trail/breadcrumb.rb

Summary

Maintainability
A
0 mins
Test Coverage
module BreadcrumbTrail

  # A single representation of a breadcrumb.
  class Breadcrumb

    # The name of the breadcrumb.  Normally, this represents the text
    # that is displayed in place of the link to give meaning to the
    # breadcrumb.
    #
    # @return [String, Symbol, Proc, nil]
    attr_reader :name

    # The path the breadcrumb represents.  Normally, this is where the
    # breadcrumb should take the user when clicked.
    #
    # @return [String, Symbol, Proc, Hash]
    attr_reader :path

    # Options for the breadcrumb.  Normally, these are HTML attributes
    # that are used for the link tag.
    #
    # @return [Hash]
    attr_reader :options

    # Initialize the breadcrumb.  If a block is given, and a path is
    # not, then the path is set to be the block.
    #
    # @param name [String, Symbol, Proc, nil] The name of the
    #   breadcrumb.  See {#name}.
    # @param path [String, Symbol, Proc, Hash] The path of the
    #   breadcrumb.  See {#path}.
    # @param options [Hash] Options that are used as HTML attributes.
    #   See {#options}.
    #
    def initialize(name: nil, path: nil, **options, &block)
      @name    = name
      @path    = path || block
      @options = options
    end

    # Creates a version of the breadcrumb that has a computed name and
    # path.  This is used, for example, in a builder that exposes a
    # breadcrumb to application code.
    #
    # @see #computed_path
    # @see #computed_name
    # @param context [ActionView::Base] The context to compute the
    #   elements under.
    # @return [Breadcrumb]
    def computed(context)
      self.class.new(name: computed_name(context),
                     path: computed_path(context),
                     **@options)
    end

    # Computes the path of the breadcrumb under the given context.
    #
    # @return [String, Hash]
    def computed_path(context)
      @_path ||= case @path
      when String, Hash
        @path
      when Symbol
        context.public_send(@path) # todo
      when Proc
        context.instance_exec(&@path)
      else
        raise ArgumentError,
          "Expected one of String, Symbol, or Proc, " \
          "got #{@path.class}"
      end
    end

    # Computes the name of the breadcrumb under the given context.
    #
    # @return [String]
    def computed_name(context)
      @_name ||= case @name
      when String
        @name
      when Symbol
        I18n.translate(@name)
      when Proc
        context.instance_exec(&@name)
      when nil
        computed_path(context)
      else
        raise ArgumentError,
          "Expected one of String, Symbol, or Proc, " \
          "got #{@name.class}"
      end
    end

  end
end