Module: Diva::Type

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

Overview

Modelの各キーに格納できる値の制約。この制約に満たない場合は、アトミックな制約であれば値の変換が行われ、そうでない場合はDiva::InvalidTypeError 例外を投げる。

これは新しくインスタンスなどを作らず、INT、FLOATなどのプリセットを利用する。

設定できる制約

Modelフィールドの制約には以下のようなものがある。

アトミックな制約

以下のような値は、DivaのModelフィールドにおいてはアトミックな制約と呼び、そのまま格納できる。

INT

数値(Integer)

FLOAT

少数(Float)

BOOL

真理値(true|false)

STRING

文字列(String)

TIME

時刻(Time)

URI

URI(Diva::URI|URI::Generic|Addressable::URI)

Model

Diva::Modelのサブクラスであれば、それを制約とすることができる。

配列

アトミックな制約またはModel制約を満たした値の配列を格納することができる。配列の全ての要素が設定された制約を満たしていれば、配列制約が満たされたことになる。

Defined Under Namespace

Classes: ArrayType, AtomicType, MetaType, ModelType, OptionalType

Constant Summary collapse

INT =
AtomicType.new(:int) 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) 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) 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) do |v|
  case v
  when Diva::Model, Enumerable
    raise Diva::InvalidTypeError, "The value is not a `#{name}'."
  else
    v.to_s
  end
end
TIME =
AtomicType.new(:time) do |v|
  case v
  when Time
    v
  when Integer, Float
    Time.at(v)
  when String
    Time.new(v)
  else
    raise Diva::InvalidTypeError, "The value is not a `#{name}'."
  end
end
URI =
AtomicType.new(:uri) 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

Instance Method Summary collapse

Instance Method Details

#array_of(type) ⇒ Object



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

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

#model_of(model) ⇒ Object



33
34
35
# File 'lib/diva/type.rb', line 33

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

#optional(type) ⇒ Object



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

def optional(type)
  OptionalType.new(type)
end