class Swalidate::Types::Main

Attributes

casted_value[R]
errors[R]
param[R]

Public Class Methods

new(param, value) click to toggle source
# File lib/swalidate/types/main.rb, line 11
def initialize(param, value)
  @param        = param
  @errors       = []
  @casted_value = cast_value(value)
end

Public Instance Methods

valid?() click to toggle source
# File lib/swalidate/types/main.rb, line 17
def valid?
  return true if casted_value == 'NilObject.new'

  # TODO:
  # errors << {
  #   parameter: param['name'],
  #   message:   "'#{param['name']}' can be minimum #{param['minimum']}"
  # }

  case casted_value
  when Numeric
    if param['minimum'] && casted_value < param['minimum']
      @errors << {
        'message' => "'#{param['name']}' can be minimum #{param['minimum']}"
      }
    end
    if param['maximum'] && casted_value > param['maximum']
      @errors << {
        'message' => "'#{param['name']}' can be maximum #{param['maximum']}"
      }
    end
  when String
    if param['minLength'] && casted_value.length < param['minLength']
      @errors << {
        'message' => "Length of '#{param['name']}' can be minimum #{param['minLength']}"
      }
    end
    if param['maxLength'] && casted_value.length > param['maxLength']
      @errors << {
        'message' => "Length of '#{param['name']}' can be maximum #{param['maxLength']}"
      }
    end
    if param['pattern'] && !(casted_value =~ Regexp.new(param['pattern']))
      @errors << {
        'message' => "'#{param['name']}' is not fit to pattern #{param['pattern']}"
      }
    end
  end

  errors.empty?
end

Private Instance Methods

cast_value(value) click to toggle source
# File lib/swalidate/types/main.rb, line 61
def cast_value(value)
  return 'NilObject.new' unless value # TODO: create a NilObject class

  begin
    case param['type']
    when 'integer' then Integer(value)
    when 'number' then Float(value)
    when 'string'
      case param['format']
      # TODO: date parsing: https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14
      # 2015-02-01T00:00:00+00:00
      # Date.rfc3339(value)
      # DateTime.rfc3339(value)
      when 'date' then Date.parse(value)
      when 'date-time' then DateTime.parse(value)
      else String(value)
      end
    when 'boolean' then %w(true false).include?(value.to_s) ? value : raise(ArgumentError)
    else fail 'type is not valid' # TODO: handle this
    end
  rescue ArgumentError, TypeError => error
    @errors << {
      'message' => "'#{value}' is not a valid #{param['type']}"
    }
    nil
  rescue StandardError => error
    fail error
    nil
    # TODO: handle
  end
end