class Astrails::Safe::Config::Builder

Constants

COLLECTIONS
ITEMS
NAMES

Public Class Methods

new(node) click to toggle source
# File lib/astrails/safe/config/builder.rb, line 9
def initialize(node)
  @node = node
end

Public Instance Methods

method_missing(sym, *args, &block) click to toggle source

supported args:

args = [value]
args = [id, data]
args = [data]

id/value - simple values, data - hash

Calls superclass method
# File lib/astrails/safe/config/builder.rb, line 18
def method_missing(sym, *args, &block)
  return super unless NAMES.include?(sym.to_s)

  # do we have id or value?
  unless args.first.is_a?(Hash)
    id_or_value = args.shift # nil for args == []
  end

  id_or_value = id_or_value.map {|v| v.to_s} if id_or_value.is_a?(Array)

  # do we have data hash?
  if data = args.shift
    raise "#{sym}: hash expected: #{data.inspect}" unless data.is_a?(Hash)
  end

  #puts "#{sym}: args=#{args.inspect}, id_or_value=#{id_or_value}, data=#{data.inspect}, block=#{block.inspect}"

  raise "#{sym}: unexpected: #{args.inspect}" unless args.empty?
  raise "#{sym}: missing arguments" unless id_or_value || data || block

  if COLLECTIONS.include?(sym.to_s) && id_or_value
    data ||= {}
  end

  if !data && !block
    # simple value assignment
    @node[sym] = id_or_value

  elsif id_or_value
    # collection element with id => create collection node and a subnode in it
    key = sym.to_s + "s"
    collection = @node[key] || @node.set(key, {})
    collection.set(id_or_value, data || {}, &block)

  else
    # simple subnode
    @node.set(sym, data || {}, &block)
  end
end