lib/mediator/parser.rb in mediator-0.0.1 vs lib/mediator/parser.rb in mediator-0.1.0

- old
+ new

@@ -13,42 +13,73 @@ def get name, options = nil selector = (options && options[:from]) || name (options && options[:value]) || data[selector] || data[selector.to_s] end - def has? name - !!get(name) + def has? name, options = nil + selector = (options && options[:from]) || name + (options && options.has_key?(:value)) || data.has_key?(selector) || data.has_key?(selector.to_s) end def id name, options = {} key "#{name}_id", options.merge(from: name) end + def ids name, options = {} + if name[-1] == "s" and !options[:from] + id_name = "#{name[0..-2]}_ids" + else + id_name = "#{name}_ids" + end + + options[:from] ||= name + + key id_name, options + end + def key name, options = nil, &block if name[-1] == "?" name = name[0..-2].intern end - value = get name, options + return unless has? name, options + value = get name, options return if empty? value, options - mediator.set name, block ? block[value] : value + + value = block ? block[value] : value + + mediator.set name, value unless empty? value, options end - def obj name, options = nil, &block + def many name, options = nil, &block data = get name, options subj = (options && options[:subject]) || mediator.get(name) - return if empty? data, options or subj.nil? + data.map { |d| sub subj[data.index d], d, options, &block }. + reject { |v| empty? v, options } + end - Mediator[subj, mediator].parse data - block[subj] if block + def one name, options = nil, &block + data = get name, options + subj = (options && options[:subject]) || mediator.get(name) - subj + sub subj, data, options, &block end def union name, options = nil, &block (options ||= {}).merge! value: self.data - obj name, options, &block + one name, options, &block + end + + private + + def sub subj, data, options, &block + return if empty? data, options or subj.nil? + + Mediator[subj, mediator].parse data + block[subj] if block + + subj end end end