バリデーションに関する処理を集めたユーティリティモジュール.
Copyright (c) 2013-2014 DWANGO Co., Ltd. All Rights Reserved.
パラメータに対して, 指定したデータ型かどうかを検証する. また, 値に対して制限(範囲や長さ等)を与えることや, オプションを指定することもできる.
オプションを指定すると検証のために与えたパラメータと結果に返るパラメータのデータ型が異なることがある.
しかし, 入出力でデータ型が異なっていた場合も返り値のパラメータはデータ型であることを保証する.
オプションを複数指定した場合, 左からパラメータに適用されるため, 与えるリストの要素の順によって結果が変わる.
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, []}
validate/2 | データ型, 制限を指定して, パラメータがその条件に一致するかを検証する. |
validate/3 | データ型, 制限を指定して, パラメータがその条件に一致するかを検証する. |
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(InputValue, Spec, Options::[Option]) -> {ok, OutputValue} | {error, Reason}
データ型, 制限を指定して, パラメータがその条件に一致するかを検証する.
オプションを指定することができる(複数指定可能).
● 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 |