Module: Diva::Type

Extended by:
Type
Included in:
Type
Defined in:
lib/diva/type.rb

Defined Under Namespace

Classes: ArrayType, AtomicType, MetaType, ModelType, TimeType, UnionType

Constant Summary collapse

INT =
AtomicType.new(:int, [Integer]) do |v|
  case v
  when Integer
    v
  when Numeric, String, Time
    v.to_i
  when TrueClass
    1
  when FalseClass
    0
  else
    raise Diva::InvalidTypeError, "The value is not a `#{name}'."
  end
end
FLOAT =
AtomicType.new(:float, [Float]) do |v|
  case v
  when Float
    v
  when Numeric, String, Time
    v.to_f
  else
    raise Diva::InvalidTypeError, "The value is not a `#{name}'."
  end
end
BOOL =
AtomicType.new(:bool, [TrueClass, FalseClass]) do |v|
  case v
  when TrueClass, FalseClass
    v
  when String
    !v.empty?
  when Integer
    v != 0
  else
    raise Diva::InvalidTypeError, "The value is not a `#{name}'."
  end
end
STRING =
AtomicType.new(:string, String) do |v|
  case v
  when Diva::Model, Enumerable
    raise Diva::InvalidTypeError, "The value is not a `#{name}'."
  else
    v.to_s
  end
end
TIME =
TimeType.new(:time, [Time, String]) do |v|
  case v
  when Time
    v
  when Integer, Float
    Time.at(v)
  when String
    begin
      Time.iso8601(v)
    rescue StandardError
      Time.parse(v)
    end
  else
    raise Diva::InvalidTypeError, "The value is not a `#{name}'."
  end
end
URI =
AtomicType.new(:uri, [Diva::URI, Addressable::URI, ::URI::Generic]) do |v|
  case v
  when Diva::URI, Addressable::URI, ::URI::Generic
    v
  when String
    Diva::URI.new(v)
  else
    raise Diva::InvalidTypeError, "The value is not a `#{name}'."
  end
end
NULL =
AtomicType.new(:null, NilClass) do |v|
  if v == nil
    v
  else
    raise Diva::InvalidTypeError, "The value is not a `#{name}'."
  end
end

Instance Method Summary collapse

Instance Method Details

#array_of(type) ⇒ Object



40
41
42
# File 'lib/diva/type.rb', line 40

def array_of(type)
  ArrayType.new(type)
end

#model_of(model) ⇒ Object



36
37
38
# File 'lib/diva/type.rb', line 36

def model_of(model)
  ModelType.new(model)
end

#optional(type) ⇒ Object



44
45
46
# File 'lib/diva/type.rb', line 44

def optional(type)
  UnionType.new(NULL, type)
end

#union(*types) ⇒ Object



48
49
50
# File 'lib/diva/type.rb', line 48

def union(*types)
  UnionType.new(*types)
end