Skip to content

Instantly share code, notes, and snippets.

@soulcutter
Last active October 21, 2022 12:08
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save soulcutter/91b90325e25bab985e60 to your computer and use it in GitHub Desktop.
Save soulcutter/91b90325e25bab985e60 to your computer and use it in GitHub Desktop.
Dealing with crazy nested hashes in MailChimp API responses
require "delegate"
require "singleton"
module MailingList
class SafeResponse < SimpleDelegator
def self.safe_delegate(*methods)
methods.each do |method|
define_method(method, ->(*args, &block) {
value = __getobj__.send(method, *args, &block)
value ? SafeResponse.new(value) : BlackHole.instance
})
end
end
safe_delegate :[]
safe_delegate :detect, :find, :first, :select
end
class BlackHole
include Singleton
def itself; self end # TODO remove when upgrading to Ruby 2.2+
[:detect, :find, :first, :select].each do |method|
alias_method method, :itself
end
def [](*); self end
def empty?; true end
alias_method :blank?, :empty?
def presence; nil end
def present?; false end
end
end
response = MailingList::SafeResponse.new(foo: [{bar: true}, {baz: false}])
response[:foo].first[:bar].presence # => true
response[:foo].first[:baz].presence # => nil
response[:nonsense].find { |x| false }.first["asdf"][0].present? # => false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment