Created
March 22, 2018 10:08
-
-
Save adityagodbole/1e5199846ea9d0be8ca520ed2da983e9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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