Sha256: 7c891c0ba1e07c0be0630d4b13ee50c1cd3a46df769852456180c84dfed0cc16

Contents?: true

Size: 1.54 KB

Versions: 3

Compression:

Stored size: 1.54 KB

Contents

module ComplexConfig
  class Tree
    def self.convert(name, value)
      case value
      when ComplexConfig::Settings
        convert(name, value.to_h)
      when Hash
        obj = new(name.to_s)
        value.each do |name, value|
          obj << convert(name, value)
        end
        obj
      when Array
        obj = new(name.to_s)
        value.each_with_index do |value, i|
          obj << convert(i, value)
        end
        obj
      else
        if name.is_a?(Integer)
          new value.inspect
        else
          new "#{name} = #{value.inspect}"
        end
      end
    end

    def initialize(name)
      @name     = name
      @children = []
    end

    private

    def inner_child_prefix(i)
      i.zero? ? "├─ " : "│  "
    end

    def last_child_prefix(i)
      i.zero? ? "└─ " : "   "
    end

    public

    def to_enum
      Enumerator.new do |y|
        y.yield @name

        @children.each_with_index do |child, child_index|
          children_enum = child.to_enum
          if child_index < @children.size - 1
            children_enum.each_with_index do |setting, i|
              y.yield "#{inner_child_prefix(i)}#{setting}"
            end
          else
            children_enum.each_with_index do |setting, i|
              y.yield "#{last_child_prefix(i)}#{setting}"
            end
          end
        end
      end
    end

    def <<(child)
      @children << child
    end

    def to_ary
      to_enum.to_a
    end

    alias to_a to_ary

    def to_str
      to_ary * ?\n
    end

    alias to_s to_str
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
complex_config-0.21.2 lib/complex_config/tree.rb
complex_config-0.21.1 lib/complex_config/tree.rb
complex_config-0.21.0 lib/complex_config/tree.rb