class Yamcha::Composer

Public Class Methods

new(node:, enable_validator: true) click to toggle source
# File lib/yamcha/composer.rb, line 5
def initialize(node:, enable_validator: true)
  @node = node
  @enable_validator = enable_validator
  @hash = {}
end

Public Instance Methods

compose() click to toggle source
# File lib/yamcha/composer.rb, line 11
def compose
  resolved_node = ::Yamcha::NodeResolver.resolve(@node)

  recursively_compose(resolved_node, @hash)
end

Private Instance Methods

compose_hash(key:, value:, hash:) click to toggle source
# File lib/yamcha/composer.rb, line 41
def compose_hash(key:, value:, hash:)
  ::Yamcha::Validator::DuplicatedMappingKey.validate!(key_name: key, hash: hash) if @enable_validator
  hash[key] = value
  hash
end
recursively_compose(resolved_node, hash) click to toggle source
# File lib/yamcha/composer.rb, line 19
def recursively_compose(resolved_node, hash)
  return resolved_node unless resolved_node.is_a? Array

  resolved_node.each_slice(2) do |node1, node2|
    resolved_node1 = ::Yamcha::NodeResolver.resolve(node1)
    resolved_node2 = ::Yamcha::NodeResolver.resolve(node2)

    if scalar_and_sequence?(node1, node2)
      hash = compose_hash(key: resolved_node1, value: resolved_node2, hash: hash)
    elsif scalar_and_mapping?(node1, node2)
      tmp_hash = {}
      result = recursively_compose(resolved_node2, tmp_hash)
      hash = compose_hash(key: resolved_node1, value: result, hash: hash)
    elsif scalar_and_saclar?(node1, node2)
      hash = compose_hash(key: resolved_node1, value: resolved_node2, hash: hash)
    else
      # noop
    end
  end
  hash
end
scalar_and_mapping?(node1, node2) click to toggle source
# File lib/yamcha/composer.rb, line 51
def scalar_and_mapping?(node1, node2)
  node1.is_a?(Psych::Nodes::Scalar) && node2.is_a?(Psych::Nodes::Mapping)
end
scalar_and_saclar?(node1, node2) click to toggle source
# File lib/yamcha/composer.rb, line 55
def scalar_and_saclar?(node1, node2)
  node1.is_a?(Psych::Nodes::Scalar) && node2.is_a?(Psych::Nodes::Scalar)
end
scalar_and_sequence?(node1, node2) click to toggle source
# File lib/yamcha/composer.rb, line 47
def scalar_and_sequence?(node1, node2)
  node1.is_a?(Psych::Nodes::Scalar) && node2.is_a?(Psych::Nodes::Sequence)
end