conditional
Version:
A preconditions package based on Google's Preconditions library
350 lines (250 loc) • 22.4 kB
HTML
<html>
<head>
<title>main.coffee</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul id="jump_to">
<li>
<a class="large" href="javascript:void(0);">Jump To …</a>
<a class="small" href="javascript:void(0);">+</a>
<div id="jump_wrapper">
<div id="jump_page">
<a class="source" href="debug_wrapper.html">
debug_wrapper.coffee
</a>
<a class="source" href="main.html">
main.coffee
</a>
<a class="source" href="util.html">
util.coffee
</a>
<a class="source" href="argument_test.html">
argument_test.coffee
</a>
<a class="source" href="common_test.html">
common_test.coffee
</a>
<a class="source" href="contains_test.html">
contains_test.coffee
</a>
<a class="source" href="defined_test.html">
defined_test.coffee
</a>
<a class="source" href="equals_test.html">
equals_test.coffee
</a>
<a class="source" href="not_empty_test.html">
not_empty_test.coffee
</a>
<a class="source" href="not_null_test.html">
not_null_test.coffee
</a>
<a class="source" href="number_type_test.html">
number_type_test.coffee
</a>
</div>
</li>
</ul>
<ul class="sections">
<li id="title">
<div class="annotation">
<h1>main.coffee</h1>
</div>
</li>
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">¶</a>
</div>
</div>
<div class="content"><div class='highlight'><pre>{
isObject
isArray, isNotArray
isNumeric
isString
isEmptyString
isNotUndefined
isUndefined
isEqual
isNotPrimitive
isPrimitive
xor
} = <span class="hljs-built_in">require</span> <span class="hljs-string">'./util'</span>
debug = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./debug_wrapper'</span>)</pre></div></div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">¶</a>
</div>
<p>throw error in a checker by default</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-title">DEFAULT_CALLBACK</span> = <span class="hljs-params">(err)</span> -></span>
<span class="hljs-keyword">throw</span> err <span class="hljs-keyword">if</span> err?
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Checker</span></span>
<span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(<span class="hljs-property">@name</span>, <span class="hljs-property">@defaultMessage</span>, <span class="hljs-property">@negate</span> = <span class="hljs-literal">false</span>, <span class="hljs-property">@argc</span> = <span class="hljs-number">1</span>)</span> -></span>
<span class="hljs-built_in">module</span>.exports[<span class="hljs-property">@name</span>] = <span class="hljs-function">=></span> <span class="hljs-property">@check</span>.apply @, arguments
debug <span class="hljs-string">"registered checker '<span class="hljs-subst">#{<span class="hljs-property">@name</span>}</span>'"</span>
<span class="hljs-attribute">check</span>: <span class="hljs-function">-></span>
message = arguments[<span class="hljs-property">@argc</span>]
callback = arguments[<span class="hljs-property">@argc</span> + <span class="hljs-number">1</span>] || DEFAULT_CALLBACK
<span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span> message <span class="hljs-keyword">is</span> <span class="hljs-string">'function'</span>
callback = message
message = <span class="hljs-literal">null</span>
args = []
<span class="hljs-attribute">Array</span>::push.call args, arg <span class="hljs-keyword">for</span> arg <span class="hljs-keyword">in</span> <span class="hljs-attribute">Array</span>::splice.call arguments, <span class="hljs-number">0</span>, <span class="hljs-property">@argc</span>
message ?= <span class="hljs-property">@getErrorMessage</span>.apply @, args
<span class="hljs-keyword">try</span>
<span class="hljs-property">@invokeError</span> message <span class="hljs-keyword">unless</span> xor <span class="hljs-property">@doCheck</span>.apply(@, args), <span class="hljs-property">@negate</span>
callback <span class="hljs-literal">null</span>
<span class="hljs-keyword">catch</span> e
callback e
<span class="hljs-attribute">invokeError</span>: <span class="hljs-function">-></span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Error <span class="hljs-string">'something went wrong'</span>
<span class="hljs-attribute">doCheck</span>: <span class="hljs-function">-></span>
<span class="hljs-literal">false</span>
<span class="hljs-attribute">getErrorMessage</span>: <span class="hljs-function">-></span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span> <span class="hljs-property">@defaultMessage</span> <span class="hljs-keyword">is</span> <span class="hljs-string">'function'</span>
<span class="hljs-property">@defaultMessage</span>.apply(@, arguments)
<span class="hljs-keyword">else</span>
<span class="hljs-property">@defaultMessage</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ArgumentChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span>
<span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.INVALID_ARGUMENT)</span> -></span>
<span class="hljs-keyword">super</span> name, message, negate
<span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(condition)</span> -></span>
isString(condition) <span class="hljs-keyword">or</span> isNumeric(condition) <span class="hljs-keyword">or</span> condition
<span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -></span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentError message
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NumberTypeChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span>
<span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.INVALID_TYPE)</span> -></span>
<span class="hljs-keyword">super</span> name, message, negate
<span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value)</span> -></span>
isNumeric value
<span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -></span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> InvalidTypeError message
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ContainsChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span>
<span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message)</span> -></span>
<span class="hljs-keyword">super</span> name, message, negate, <span class="hljs-number">2</span>
<span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value, object)</span> -></span>
argumentChecker.check object, <span class="hljs-string">'invalid collection value'</span>
<span class="hljs-keyword">switch</span>
<span class="hljs-keyword">when</span> isString object
<span class="hljs-keyword">not</span> ((<span class="hljs-keyword">not</span> isString value) <span class="hljs-keyword">or</span>
(value.length > object.length) <span class="hljs-keyword">or</span>
((isEmptyString(object) ^ isEmptyString(value))) <span class="hljs-keyword">or</span>
(<span class="hljs-keyword">not</span> (isEmptyString(object) <span class="hljs-keyword">or</span> value <span class="hljs-keyword">in</span> object)))
<span class="hljs-keyword">when</span> isArray object <span class="hljs-keyword">then</span> value <span class="hljs-keyword">in</span> object
<span class="hljs-keyword">when</span> isNumeric object <span class="hljs-keyword">then</span> ~object.toString().indexOf value
<span class="hljs-keyword">else</span> value <span class="hljs-keyword">of</span> object
<span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -></span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UnknownValueError message
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EqualsChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span>
<span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message)</span> -></span>
<span class="hljs-keyword">super</span> name, message, negate, <span class="hljs-number">2</span>
<span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(actual, expected)</span> -></span>
argumentChecker.check isNotUndefined(expected), <span class="hljs-string">'invalid value expected'</span>
isEqual actual, expected
<span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -></span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UnknownValueError message
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DefinedChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span>
<span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.UNDEFINED_VALUE)</span> -></span>
<span class="hljs-keyword">super</span> name, message, negate
<span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value)</span> -></span>
isNotUndefined value
<span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -></span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UndefinedValueError message
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EmptyChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span>
<span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.ILLEGAL_VALUE)</span> -></span>
<span class="hljs-keyword">super</span> name, message, negate
<span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value)</span> -></span>
value <span class="hljs-keyword">is</span> <span class="hljs-literal">null</span> <span class="hljs-keyword">or</span> isUndefined(value) <span class="hljs-keyword">or</span>
(isNotPrimitive(value) <span class="hljs-keyword">and</span>
((hasOwnProperty.call(value, <span class="hljs-string">'length'</span>) <span class="hljs-keyword">and</span> value.length <span class="hljs-keyword">is</span> <span class="hljs-number">0</span>) <span class="hljs-keyword">or</span>
(<span class="hljs-keyword">typeof</span> value <span class="hljs-keyword">is</span> <span class="hljs-string">'object'</span> <span class="hljs-keyword">and</span> Object.keys(value).length <span class="hljs-keyword">is</span> <span class="hljs-number">0</span>)))
<span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -></span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalValueError message
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">StateChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ArgumentChecker</span></span>
<span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name)</span> -></span>
<span class="hljs-keyword">super</span> name, <span class="hljs-literal">false</span>, DEFAULT_MESSAGES.ILLEGAL_STATE
<span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -></span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalStateError message
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NullChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span>
<span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.NULL_VALUE)</span> -></span>
<span class="hljs-keyword">super</span> name, message, negate
<span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value)</span> -></span>
isUndefined(value) <span class="hljs-keyword">or</span> value <span class="hljs-keyword">is</span> <span class="hljs-literal">null</span>
<span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -></span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalValueError message
DEFAULT_MESSAGES =
INVALID_ARGUMENT : <span class="hljs-string">'invalid argument'</span>
INVALID_TYPE : <span class="hljs-string">'invalid type'</span>
UNKNOWN_VALUE : <span class="hljs-string">'unknown value'</span>
UNDEFINED_VALUE : <span class="hljs-string">'undefined value'</span>
ILLEGAL_VALUE : <span class="hljs-string">'illegal value'</span>
ILLEGAL_STATE : <span class="hljs-string">'illegal state'</span>
NULL_VALUE : <span class="hljs-string">'value is null'</span>
<span class="hljs-function">
<span class="hljs-title">AbstractError</span> = <span class="hljs-params">(<span class="hljs-property">@message</span>)</span> -></span>
Error.call(@)
Error.captureStackTrace(@, arguments.callee)
<span class="hljs-property">@name</span> = arguments.callee?.caller?.name <span class="hljs-keyword">or</span> <span class="hljs-string">'Error'</span>
AbstractError.prototype.__proto__ = Error.prototype
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IllegalArgumentError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">InvalidTypeError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UnknownValueError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UndefinedValueError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IllegalValueError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IllegalStateError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span></pre></div></div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">¶</a>
</div>
<p>export all preconditions</p>
</div>
<div class="content"><div class='highlight'><pre>argumentChecker = <span class="hljs-keyword">new</span> ArgumentChecker <span class="hljs-string">'checkArgument'</span>
<span class="hljs-keyword">new</span> NumberTypeChecker <span class="hljs-string">'checkNumberType'</span>
<span class="hljs-keyword">new</span> NumberTypeChecker <span class="hljs-string">'checkNotNumberType'</span>, <span class="hljs-literal">true</span>
<span class="hljs-keyword">new</span> ContainsChecker <span class="hljs-string">'checkContains'</span>, <span class="hljs-literal">false</span>,
<span class="hljs-function"><span class="hljs-params">(value, object)</span> -></span> <span class="hljs-string">"unknown value '<span class="hljs-subst">#{value}</span>'"</span>
<span class="hljs-keyword">new</span> ContainsChecker <span class="hljs-string">'checkDoesNotContain'</span>, <span class="hljs-literal">true</span>,
<span class="hljs-function"><span class="hljs-params">(value, object)</span> -></span> <span class="hljs-string">"'<span class="hljs-subst">#{value}</span>' is a known value"</span>
<span class="hljs-keyword">new</span> EqualsChecker <span class="hljs-string">'checkEquals'</span>, <span class="hljs-literal">false</span>,
<span class="hljs-function"><span class="hljs-params">(actual, expected)</span> -></span>
<span class="hljs-string">"expected '<span class="hljs-subst">#{expected}</span>' but got '<span class="hljs-subst">#{actual}</span>'"</span>
<span class="hljs-keyword">new</span> EqualsChecker <span class="hljs-string">'checkDoesNotEqual'</span>, <span class="hljs-literal">true</span>,
<span class="hljs-function"><span class="hljs-params">(actual)</span> -></span> <span class="hljs-string">"did not expect value '<span class="hljs-subst">#{actual}</span>'"</span>
<span class="hljs-keyword">new</span> DefinedChecker <span class="hljs-string">'checkDefined'</span>
<span class="hljs-keyword">new</span> DefinedChecker <span class="hljs-string">'checkUndefined'</span>, <span class="hljs-literal">true</span>,
<span class="hljs-function"><span class="hljs-params">(value)</span> -></span> <span class="hljs-string">"'<span class="hljs-subst">#{value}</span>' is a defined value"</span>
<span class="hljs-keyword">new</span> EmptyChecker <span class="hljs-string">'checkEmpty'</span>, <span class="hljs-literal">false</span>, <span class="hljs-function"><span class="hljs-params">(value)</span> -></span> <span class="hljs-string">"'<span class="hljs-subst">#{value}</span>' is not empty"</span>
<span class="hljs-keyword">new</span> EmptyChecker <span class="hljs-string">'checkNotEmpty'</span>, <span class="hljs-literal">true</span>
<span class="hljs-keyword">new</span> StateChecker <span class="hljs-string">'checkState'</span>
<span class="hljs-keyword">new</span> NullChecker <span class="hljs-string">'checkNull'</span>, <span class="hljs-literal">false</span>, <span class="hljs-function"><span class="hljs-params">(value)</span> -></span> <span class="hljs-string">"'<span class="hljs-subst">#{value}</span>' is not null"</span>
<span class="hljs-keyword">new</span> NullChecker <span class="hljs-string">'checkNotNull'</span>, <span class="hljs-literal">true</span></pre></div></div>
</li>
<li id="section-4">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-4">¶</a>
</div>
<p>export error types</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-built_in">module</span>.exports.IllegalArgumentError = IllegalArgumentError
<span class="hljs-built_in">module</span>.exports.InvalidTypeError = InvalidTypeError
<span class="hljs-built_in">module</span>.exports.UnknownValueError = UnknownValueError
<span class="hljs-built_in">module</span>.exports.UndefinedValueError = UndefinedValueError
<span class="hljs-built_in">module</span>.exports.IllegalValueError = IllegalValueError
<span class="hljs-built_in">module</span>.exports.IllegalStateError = IllegalStateError</pre></div></div>
</li>
</ul>
</div>
</body>
</html>