Sha256: 072bd5467e8e1153f8630ef8a4af70de4781a02814e9e2a5cb231c7766fcaef4

Contents?: true

Size: 1.25 KB

Versions: 3

Compression:

Stored size: 1.25 KB

Contents

module HaveAPI::Client
  class Parameters::Typed
    module Boolean
      def self.to_b(str)
        return true if str === true
        return true if str =~ /^(true|t|yes|y|1)$/i

        return false if str === false
        return false if str =~ /^(false|f|no|n|0)$/i

        false
      end
    end

    attr_reader :errors, :value

    def initialize(params, desc, value)
      @params = params
      @desc = desc
      @value = coerce(value)
      @errors = []
    end

    def valid?
      ret = Validator.validate(@desc[:validators], @value, @params)

      @errors.concat(ret) unless ret === true
      ret === true
    end

    def to_api
      if @desc[:type] == 'Datetime' && value.is_a?(Time)
        value.iso8601

      else
        value
      end
    end

    protected
    def coerce(raw)
      type = @desc[:type]

      val = if type == 'Integer'
        raw.to_i

      elsif type == 'Float'
        raw.to_f

      elsif type == 'Boolean'
        Boolean.to_b(raw)

      elsif type == 'Datetime'
        begin
          Time.iso8601(raw)

        rescue ArgumentError
          @errors << 'not in ISO 8601 format'
          nil
        end

      elsif type == 'String'
        raw.to_s

      else
        raw
      end

      val
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
haveapi-client-0.4.2 lib/haveapi/client/parameters/typed.rb
haveapi-client-0.4.1 lib/haveapi/client/parameters/typed.rb
haveapi-client-0.4.0 lib/haveapi/client/parameters/typed.rb