class InputSanitizer::V2::Types::StringCheck

Public Instance Methods

call(value, options = {}) click to toggle source
# File lib/input_sanitizer/v2/types.rb, line 79
def call(value, options = {})
  if options[:allow] && !options[:allow].include?(value)
    raise InputSanitizer::ValueNotAllowedError.new(value)
  elsif value.blank? && (options[:allow_blank] == false || options[:required] == true)
    raise InputSanitizer::BlankValueError
  elsif options[:regexp] && options[:regexp].match(value).nil?
    raise InputSanitizer::RegexpMismatchError.new
  elsif value == nil && options[:allow_nil] == false
    raise InputSanitizer::BlankValueError
  elsif value.blank?
    value
  else
    value.to_s.tap do |string|
      raise InputSanitizer::TypeMismatchError.new(value, :string) unless string == value
      raise InputSanitizer::ValueError.new(value, options[:minimum], options[:maximum]) if options[:minimum] && string.length < options[:minimum]
      raise InputSanitizer::ValueError.new(value, options[:minimum], options[:maximum]) if options[:maximum] && string.length > options[:maximum]
    end

    if options[:strip_4byte_chars] && !options[:already_stripped]
      value_without_4byte_chars = strip_4byte_chars(value)
      updated_options = options.merge(:already_stripped => true) # to prevent infinite loop
      call(value_without_4byte_chars, updated_options) # run checks once again to ensure string is still valid after stripping 4-byte chars
    else
      value
    end
  end
end

Private Instance Methods

strip_4byte_chars(string) click to toggle source
# File lib/input_sanitizer/v2/types.rb, line 109
def strip_4byte_chars(string)
  string.each_char.with_object(String.new) { |char, output| output << char if char.bytesize < 4 }
end