Sha256: 820a9c37a6b789a35c4545c4484d79ba377cd53fdfcf5ecd12a2e011cf9102e1
Contents?: true
Size: 1.36 KB
Versions: 5
Compression:
Stored size: 1.36 KB
Contents
module Monolens module Object class Values include Lens signature(Type::Object, Type::Object, { lenses: [Type::Lenses, false], on_error: [Type::Strategy.error(%w{fail handler keep null skip}), false], }) def call(arg, world = {}) is_hash!(arg, world) lenses = option(:lenses) result = arg.dup arg.each_pair do |attr, value| deeper(world, attr) do |w| begin result[attr] = lenses.call(value, w) rescue Monolens::LensError => ex strategy = option(:on_error, :fail) handle_error(strategy, ex, result, attr, value, world) end end end result end def handle_error(strategy, ex, result, attr, value, world) strategy = strategy.to_sym unless strategy.is_a?(::Array) case strategy when ::Array strategy.each{|s| handle_error(s, ex, result, attr, value, world) } when :fail raise when :handler error_handler!(world).call(ex) when :keep result[attr] = value when :null result[attr] = nil when :skip result.delete(attr) else raise Monolens::Error, "Unexpected error strategy `#{strategy}`" end end private :handle_error end end end
Version data entries
5 entries across 5 versions & 1 rubygems