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