lib/envied/coercer/envied_string.rb in envied-0.9.1 vs lib/envied/coercer/envied_string.rb in envied-0.9.2.rc1

- old
+ new

@@ -1,23 +1,72 @@ -require 'coercible' +class ENVied::Coercer::ENViedString + TRUE_VALUES = %w[1 on t true y yes].freeze + FALSE_VALUES = %w[0 off f false n no].freeze + BOOLEAN_MAP = (TRUE_VALUES.product([ true ]) + FALSE_VALUES.product([ false ])).to_h.freeze -class ENVied::Coercer::ENViedString < Coercible::Coercer::String def to_array(str) str.split(/(?<!\\),/).map{|i| i.gsub(/\\,/,',') } end + def to_boolean(str) + BOOLEAN_MAP.fetch(str&.downcase) do + raise_unsupported_coercion(str, __method__) + end + end + + def to_date(str) + require 'date' + ::Date.parse(str) + rescue ArgumentError + raise_unsupported_coercion(str, __method__) + end + + def to_float(str) + Float(str) + rescue ArgumentError + raise_unsupported_coercion(str, __method__) + end + def to_hash(str) require 'cgi' ::CGI.parse(str).map { |key, values| [key, values[0]] }.to_h end + def to_string(str) + if str.respond_to?(:to_str) + str.public_send(:to_str) + else + raise_unsupported_coercion(str, __method__) + end + end + + def to_symbol(str) + str.to_sym + end + + def to_time(str) + require 'time' + ::Time.parse(str) + rescue ArgumentError + raise_unsupported_coercion(str, __method__) + end + def to_uri(str) require 'uri' ::URI.parse(str) end def to_integer(str) Integer(str) rescue ArgumentError raise_unsupported_coercion(str, __method__) + end + + private + + def raise_unsupported_coercion(value, method) + raise( + ENVied::Coercer::UnsupportedCoercion, + "#{self.class}##{method} doesn't know how to coerce #{value.inspect}" + ) end end