Skip to content

Instantly share code, notes, and snippets.

@adityagodbole
Created March 22, 2018 10:08
Show Gist options
  • Save adityagodbole/1e5199846ea9d0be8ca520ed2da983e9 to your computer and use it in GitHub Desktop.
Save adityagodbole/1e5199846ea9d0be8ca520ed2da983e9 to your computer and use it in GitHub Desktop.
require 'dry-struct'
require 'dry-initializer'
module Types
include Dry::Types.module
class ExtHash < ::Hash
def self.from_hash(hsh)
new.merge! hsh
end
def compact
self.class.new.merge!(to_h.select { |_, v| v })
end
def hyphenate_keys
hsh = each_with_object({}) do |(k, v), memo|
memo[k.to_s.tr('_', '-').to_sym] = v
end
self.class.new.merge!(hsh)
end
def deep_merge(second)
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
self.merge(second, &merger)
end
end
class SafeStruct < Dry::Struct
constructor_type :safe_with_defaults
end
end
# dry-types issue 194
module Dry
module Types
class Hash
class SafeWithDefaults < StrictWithDefaults
private
def resolve(hash)
sub = sub_hash(symbolize_keys(hash), member_types.keys)
super(sub)
end
def sub_hash(hash, keys)
keys = keys.select { |k| hash.key?(k) }
::Hash[keys.zip(hash.values_at(*keys))]
end
def symbolize_keys(hash)
hash.inject({}) { |memo, (k, v)|
memo[k.to_sym] = v
memo
}
end
end
def safe_with_defaults(type_map)
schema(type_map, SafeWithDefaults)
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment