class Spigot::Map::Definition

Public Class Methods

define(resource, name, value = nil, &block) click to toggle source
# File lib/spigot/map/definition.rb, line 12
def self.define(resource, name, value = nil, &block)
  definition = new(name, value, &block)
  resource.append definition
  definition
end
new(name, args = nil, parent = nil, &block) click to toggle source
# File lib/spigot/map/definition.rb, line 4
def initialize(name, args = nil, parent = nil, &block)
  @name = name
  @value = args
  @children = []
  instance_eval(&block) if @value.nil? && block_given?
  @parse = block unless @children.any?
end

Public Instance Methods

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

Spigot::Map::Definition.new(:user){ username :login } Spigot::Map::Definition.new(:user){ username = :login }

# File lib/spigot/map/definition.rb, line 63
def method_missing(name, *args, &block)
  name = name.to_s.gsub('=', '').to_sym
  @children << Spigot::Map::Definition.new(name, *args, &block)
end
parse(data) click to toggle source
# File lib/spigot/map/definition.rb, line 18
def parse(data)
  return {} if data.nil?

  data.default_proc = proc { |h, k| h.key?(k.to_s) ? h[k.to_s] : nil } if data.is_a?(Hash)
  if @children.empty?
    unless data.is_a?(Hash)
      raise Spigot::InvalidSchemaError, "Cannot extract :#{@name} from #{data.inspect}"
    end

    value = @parse ? @parse.call(data[@name]) : data[@name]
    if @value.is_a?(Class)
      translator = @value.spigot.translator
      translator.data = value
      return { @value.name.underscore.to_sym => translator.format }
    end

    return { @value.to_sym => value }
  end

  if data[@name].is_a?(Array)
    set = []
    data[@name].each do |element|
      set << parse_children(element)
    end
    { @name.to_sym => set }
  else
    parse_children(data[@name])
  end
end
to_hash() click to toggle source
# File lib/spigot/map/definition.rb, line 48
def to_hash
  result = {}
  value = nil
  if @children.any?
    value = {}
    @children.each { |child| value.merge!(child.to_hash) }
  else
    value = @value
  end

  result.merge!(@name => value)
end

Private Instance Methods

parse_children(data) click to toggle source
# File lib/spigot/map/definition.rb, line 70
def parse_children(data)
  child_hash = {}
  @children.each do |child|
    child_hash.merge!(child.parse(data))
  end
  child_hash
end