Sha256: 94e9721accf96447439cbe35cee0361c2fe5f27304232883402c17cb8b920135
Contents?: true
Size: 1.97 KB
Versions: 2
Compression:
Stored size: 1.97 KB
Contents
module JSONLogic class Operation LAMBDAS = { 'var' => ->(v, d) { d.deep_fetch(*v) }, 'missing' => ->(v, d) { v.select { |val| d.deep_fetch(val).nil? } }, 'missing_some' => ->(v, d) { present = v[1] & d.keys present.size >= v[0] ? [] : LAMBDAS['missing'].call(v[1], d) }, 'if' => ->(v, d) { v.each_slice(2) do |condition, value| return condition if value.nil? return value if condition.truthy? end }, '==' => ->(v, d) { v[0].to_s == v[1].to_s }, '===' => ->(v, d) { v[0] == v[1] }, '!=' => ->(v, d) { v[0].to_s != v[1].to_s }, '!==' => ->(v, d) { v[0] != v[1] }, '!' => ->(v, d) { v[0].falsy? }, '!!' => ->(v, d) { v[0].truthy? }, 'or' => ->(v, d) { v.find(&:truthy?) || v.last }, 'and' => ->(v, d) { result = v.find(&:falsy?) result.nil? ? v.last : result }, '?:' => ->(v, d) { LAMBDAS['if'].call(v, d) }, '>' => ->(v, d) { v.map(&:to_i).each_cons(2).all? { |i, j| i > j } }, '>=' => ->(v, d) { v.map(&:to_i).each_cons(2).all? { |i, j| i >= j } }, '<' => ->(v, d) { v.map(&:to_i).each_cons(2).all? { |i, j| i < j } }, '<=' => ->(v, d) { v.map(&:to_i).each_cons(2).all? { |i, j| i <= j } }, 'max' => ->(v, d) { v.map(&:to_i).max }, 'min' => ->(v, d) { v.map(&:to_i).min }, '+' => ->(v, d) { v.map(&:to_i).reduce(:+) }, '-' => ->(v, d) { v.map!(&:to_i); v.size == 1 ? -v.first : v.reduce(:-) }, '*' => ->(v, d) { v.map(&:to_i).reduce(:*) }, '/' => ->(v, d) { v.map(&:to_f).reduce(:/) }, '%' => ->(v, d) { v.map(&:to_i).reduce(:%) }, 'merge' => ->(v, d) { v.flatten }, 'in' => ->(v, d) { v[1].include? v[0] }, 'cat' => ->(v, d) { v.map(&:to_s).join }, 'log' => ->(v, d) { puts v } } def self.perform(operator, values, data) LAMBDAS[operator].call(values, data) end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
json_logic-0.1 | lib/json_logic/operation.rb |
json_logic-0.0.1 | lib/json_logic/operation.rb |