I’m wondering how one would define a Hash param (ex: for HTTP headers) that accepts a String, which is first validated using a Regex, then parsed into a Hash. I know about dry-types .constructor and dry-validations’s before(:key_coercer), but am unclear how to insert a validation rule specifically for String values, before the coercion from String to Hash.
I did something vaguely similar to this for XML, maybe this will help
module Types
XML = String.constrained(format: %r{^<\?xml}).constructor do |input, type|
if input.is_a?(Nokogiri::XML::Document)
input
elsif type.valid?(input)
Nokogiri.parse(input)
else
type.(input)
end
end
end
1 Like