class Bosh::Cli::YamlHelper

Public Class Methods

check_duplicate_keys(yaml_str) click to toggle source
# File lib/cli/yaml_helper.rb, line 47
def check_duplicate_keys(yaml_str)
  document = Psych.parse(yaml_str)
  process_mapping(document.root) if document
end

Private Class Methods

process_mapping(m) click to toggle source
# File lib/cli/yaml_helper.rb, line 28
def process_mapping(m)
  return unless m.children
  s = Set.new

  m.children.each_with_index do |key_or_value, index|
    next if index.odd? # skip the values
    key = key_or_value.value # Sorry this is confusing, Psych mappings don't behave nicely like maps
    raise "Found duplicate key '#{key}'" if s.include?(key)
    s.add(key)
  end

  m.children.each_with_index do |key_or_value, index|
    next if index.even? # skip the keys
    process_object(key_or_value)
  end
end
process_object(o) click to toggle source
# File lib/cli/yaml_helper.rb, line 7
def process_object(o)
  case o
    when Psych::Nodes::Mapping
      process_mapping(o)
    when Psych::Nodes::Sequence
      process_sequence(o)
    when Psych::Nodes::Scalar
      # noop
    when Psych::Nodes::Alias
      # noop
    else
      err("Unhandled class #{o.class}, fix yaml duplicate check")
  end
end
process_sequence(s) click to toggle source
# File lib/cli/yaml_helper.rb, line 22
def process_sequence(s)
  s.children.each do |v|
    process_object(v)
  end
end