Skip to content

Latest commit

 

History

History
399 lines (232 loc) · 13.9 KB

moyo_validator.md

File metadata and controls

399 lines (232 loc) · 13.9 KB

Module moyo_validator

バリデーションに関する処理を集めたユーティリティモジュール.

Copyright (c) 2013-2014 DWANGO Co., Ltd. All Rights Reserved.

Description

パラメータに対して, 指定したデータ型かどうかを検証する. また, 値に対して制限(範囲や長さ等)を与えることや, オプションを指定することもできる.

オプションを指定すると検証のために与えたパラメータと結果に返るパラメータのデータ型が異なることがある.
しかし, 入出力でデータ型が異なっていた場合も返り値のパラメータはデータ型であることを保証する.
オプションを複数指定した場合, 左からパラメータに適用されるため, 与えるリストの要素の順によって結果が変わる.

Data Types


basic_type() = integer | float | number | string | binary | boolean | atom | datetime | any

binary_constraint() = {max_length, integer()} | {min_length, integer()} | {regexp, binary()} | ascii | not_empty

custom_spec_fun() = fun((InputValue::term()) -> boolean())

datetime_constraint() = {range, calendar:datetime(), calendar:datetime()} | {equal, calendar:datetime()} | {more, calendar:datetime()} | {less, calendar:datetime()}

float_constraint() = sign_constraint() | {range, min_number(), max_number()} | {more, number()} | {less, number()}

integer_constraint() = sign_constraint() | even | odd | {range, min(), max()} | {more, integer()} | {less, integer()} | {sign(), number_of_bits()}

max() = integer()

max_number() = number()

min() = integer()

min_number() = number()

number_constraint() = sign_constraint() | {range, min_number(), max_number()} | {more, number()} | {less, number()}

number_of_bits() = pos_integer()

option() = binary_in | {binary_in, option_binary_in_output_type()} | int_to_bool | {transform, transform_fun()} | allow_integer | to_datetime | {to_datetime, option_to_datetime_input_type()}

option_binary_in_output_type() = basic_type() | existing_atom

option_to_datetime_input_type() = iso8601 | unixtime

sign() = signed | unsigned

sign_constraint() = positive | negative | non_negative

spec() = basic_type() | type_constraints() | {list, spec()} | {tuple, [spec()]} | {enum, [term()]} | {equal, term()} | {'or', [spec()]} | {'and', [spec()]} | {'not', spec()} | {custom, custom_spec_fun()}

{list, spec()}: 入力値がspec()に適合する値を要素とするリストかをチェックする
{tuple, [spec()]}: 入力値の各要素がspec()と適合するかチェックする. spec()tupleの要素数用意する必要がある.
{enum, [term()]}: 入力値が[term()]のいずれかの要素と等しいかどうかをチェックする
{equal, term()}: 入力値がterm()と等しいかどうかをチェックする
{'or', [spec()]}: 入力値が[spec()]のいずれかの条件に適合するかをチェックする
{'and', [spec()]}: 入力値が[spec()]の全ての条件に適合するかをチェックする
{'not', spec()}: 入力値がspec()とマッチしないことをチェックする
{custom, custom_spec_fun()}: 入力値がcustom_spec_fun()で指定の条件に適合するかどうかをチェックする


string_constraint() = {max_length, integer()} | {min_length, integer()} | {regexp, string()} | ascii | not_empty

transform_fun() = fun((InputValue::term()) -> TransformedValue::term())

type_constraints() = {integer, [integer_constraint()]} | {float, [float_constraint()]} | {number, [number_constraint()]} | {string, [string_constraint()]} | {binary, [binary_constraint()]} | {datetime, [datetime_constraint()]} | {boolean, []} | {atom, []} | {any, []}

Function Index

validate/2データ型, 制限を指定して, パラメータがその条件に一致するかを検証する.
validate/3データ型, 制限を指定して, パラメータがその条件に一致するかを検証する.

Function Details

validate/2


validate(InputValue, Spec) -> {ok, OutputValue} | {error, Reason}
  • InputValue = term()
  • Spec = spec()
  • OutputValue = term()
  • Reason = term()

データ型, 制限を指定して, パラメータがその条件に一致するかを検証する.

データ型だけではなく, 値等に制限を掛けて検査することができる.

  ● integer
      ○ positive
          パラメータが負数, または, 0の時にerror.
      ○ negative
          パラメータが正数, または, 0の時にerror.
      ○ non_negative
          パラメータが負の数の場合error.
      ○ even
          パラメータが奇数の場合error.
      ○ odd
          パラメータが偶数の場合error.
      ○ {range, min(), max()}
          パラメータがmin()からmax()の間に含まれない場合error.
          パラメータがmin(), max()と同じ値の場合はokを返す.
      ○ {more, integer()}
          パラメータがinteger()以下の場合error.
      ○ {less, integer()}
          パラメータがinteger()以上の場合error.
      ○ {signed | unsigned, Bits}
          `Bits' ビットの符号あり/なしで表現できる数値の範囲外の場合error.
  ● float
      ○ positive
          パラメータが負数, または, 0の時にerror.
      ○ negative
          パラメータが正数, または, 0の時にerror.
      ○ non_negative
          パラメータが負の数の場合error.
      ○ {range, min_number(), max_number()}
          パラメータがmin_number()からmax_number()の間に含まれない場合error.
          パラメータがmin_number(), max_number()と同じ値の場合はokを返す.
      ○ {more, integer()}
          パラメータがinteger()以下の場合error.
      ○ {less, integer()}
          パラメータがinteger()以上の場合error.
  ●number
      ○ positive
          パラメータが負数, または, 0の時にerror.
      ○ negative
          パラメータが正数, または, 0の時にerror.
      ○ non_negative
          パラメータが負の数の場合error.
      ○ {range, min_number(), max_number()}
          パラメータがmin_number()からmax_number()の間に含まれない場合error.
          パラメータがmin_number(), max_number()と同じ値の場合はokを返す.
      ○ {more, integer()}
          パラメータがinteger()以下の場合error.
      ○ {less, integer()}
          パラメータがinteger()以上の場合error.
  ● string, binary
      ○ {max_length, integer()}
          パラメータの長さがinteger()より大きい場合error
      ○ {min_length, integer()}
          パラメータの長さがinteger()より小さい場合error.
      ○ {regexp, string() | binary()}
          パラメータが正規表現string() | binary()にマッチしない場合はerror
      ○ascii
          パラメータがASCII文字列かどうか
      ○not_empty
          パラメータが空文字じゃないかどうか
  ●datetime
      ◯{more,calendar:datetime(}
          パラメータが値より大きいかをチェックする
      ◯{less,calendar:datetime()}
          パラメータが値より小さいかをチェックする
      ◯{range calendar:datetime(), calendar:datetime()}
          パラメータがMin以上Max以下であるかをチェックする
      ◯{equal,calendar:datetime()}

validate/3


validate(InputValue, Spec, Options::[Option]) -> {ok, OutputValue} | {error, Reason}
  • InputValue = term()
  • Spec = spec()
  • Option = option()
  • OutputValue = term()
  • Reason = term()

データ型, 制限を指定して, パラメータがその条件に一致するかを検証する.

オプションを指定することができる(複数指定可能).

  ● binary_in
      バイナリタイプのパラメータのみ受け付ける.
      出力時はバリデートするタイプに変換される.
      ※ 出力タイプが`atom'の場合は、入力に対応するアトムが既にあるかどうかに関わらず、<br />
        強制的にアトムが生成されるのでメモリリークを防ぐため、代わりに`{binary_in, existing_atom}'を使うことを推奨
      また, バリデーション対象の型は通さない.
      例として, integerのバリデーションだとしても, integer型のパラメータは通さない.
  ● {binary_in, option_binary_in_output_type()}
      バイナリタイプのパラメータのみ受け付ける.
      出力時は`option_binary_in_output_type()'で指定されたタイプに変換される.
  ● int_to_bool
      1, 0をbooleanとして扱う. 1がtrue, 0がfalse.
      このオプションを指定した時, true, falseは通さない.
  ● {transform, fun()}
      fun()に任意の関数を指定できる. このオプションを指定した場合,
      パラメータをこの関数に通してからバリデーションを行う.
  ● allow_integer
      typeとしてfloatを指定している時にintegerが来た場合でも許可する.
  ● to_datetime
      datetime型に変換する.変換元はunixtime, iso8601が可能.
  ● {to_datetime, option_to_datetime_input_type()}
      入力形式を指定した型のみに制限する.

型をdatetimeに指定した時のbinary_inの詳細な動作は以下の表にまとめる。(リストに入れる順番はbinary_inが先である必要がある)

<<"12345">> <<"2014-07-01T01:02:03">>
(併記なし) error error
to_datetime ok ok
{to_datetime, unixtime} ok error
{to_datetime, iso8601} error ok