include "testLib"; def typecheckingEnabled: if $ENV["TYPECHECKING"] != null and (["1", "true", "on"] | any(index($ENV["TYPECHECKING"]))) then true else false end; def typecheckingDebug: if $ENV["TYPECHECKING_DEBUG"] != "" and $ENV["TYPECHECKING_DEBUG"] != null then true else false end; def typeErrorText: . as $type | "Type Error Checking '\($type)'"; def typeErrorText($type): $type | typeErrorText; def typeError($type): if typecheckingDebug then debug({$type, value: .}) end | error($type | typeErrorText); def ensureNull: if typecheckingEnabled and (. | type != "null") then typeError("null") end; def ensureBool: if typecheckingEnabled and (. | type) != "boolean" then typeError("bool") end; def ensureString: if typecheckingEnabled and (. | type) != "string" then typeError("string") end; def ensureArray: if typecheckingEnabled and (. | type) != "array" then typeError("array") end; def ensureObject: if typecheckingEnabled and (. | type) != "object" then typeError("object") end; def ensureNumber: if typecheckingEnabled and (. | type) != "number" then typeError("number") end; def ensureNull($value): $value | ensureNull; def ensureBool($value): $value | ensureBool; def ensureString($value): $value | ensureString; def ensureArray($value): $value | ensureArray; def ensureObject($value): $value | ensureObject; def ensureNumber($value): $value | ensureNumber; def ensureNullOr(ensureType): if . == null then . else . | ensureType end; def ensureKey($type; $key): if (. | has($key) | not) then typeError("\($type):\($key)") end; def ensureKey($value; $type; $key): $value | ensureKey($type; $key); # TYPECHECKING=1 required for tests def typeLibTests: expectPassed(runTest( "null is null"; (null | ensureNull); true; false )) | expectPassed(runTest( "boolean is not null"; (true | ensureNull); (. == typeErrorText("null")); true ));