12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324 |
- local OptionalType, TaggedType, types, is_type
- local BaseType, TransformNode, SequenceNode, FirstOfNode, DescribeNode, NotType, Literal
- local FailedTransform = { }
- local unpack = unpack or table.unpack
- local clone_state
- clone_state = function(state_obj)
- if type(state_obj) ~= "table" then
- return { }
- end
- local out
- do
- local _tbl_0 = { }
- for k, v in pairs(state_obj) do
- _tbl_0[k] = v
- end
- out = _tbl_0
- end
- do
- local mt = getmetatable(state_obj)
- if mt then
- setmetatable(out, mt)
- end
- end
- return out
- end
- local describe_type
- describe_type = function(val)
- if type(val) == "string" then
- if not val:match('"') then
- return "\"" .. tostring(val) .. "\""
- elseif not val:match("'") then
- return "'" .. tostring(val) .. "'"
- else
- return "`" .. tostring(val) .. "`"
- end
- elseif BaseType:is_base_type(val) then
- return val:_describe()
- else
- return tostring(val)
- end
- end
- local coerce_literal
- coerce_literal = function(value)
- local _exp_0 = type(value)
- if "string" == _exp_0 or "number" == _exp_0 or "boolean" == _exp_0 then
- return Literal(value)
- elseif "table" == _exp_0 then
- if BaseType:is_base_type(value) then
- return value
- end
- end
- return nil, "failed to coerce literal into type, use types.literal() to test for literal value"
- end
- local join_names
- join_names = function(items, sep, last_sep)
- if sep == nil then
- sep = ", "
- end
- local count = #items
- local chunks = { }
- for idx, name in ipairs(items) do
- if idx > 1 then
- local current_sep
- if idx == count then
- current_sep = last_sep or sep
- else
- current_sep = sep
- end
- table.insert(chunks, current_sep)
- end
- table.insert(chunks, name)
- end
- return table.concat(chunks)
- end
- do
- local _class_0
- local _base_0 = {
- __div = function(self, fn)
- return TransformNode(self, fn)
- end,
- __mod = function(self, fn)
- do
- local _with_0 = TransformNode(self, fn)
- _with_0.with_state = true
- return _with_0
- end
- end,
- __mul = function(_left, _right)
- local left, err = coerce_literal(_left)
- if not (left) then
- error("left hand side of multiplication: " .. tostring(_left) .. ": " .. tostring(err))
- end
- local right
- right, err = coerce_literal(_right)
- if not (right) then
- error("right hand side of multiplication: " .. tostring(_right) .. ": " .. tostring(err))
- end
- return SequenceNode(left, right)
- end,
- __add = function(_left, _right)
- local left, err = coerce_literal(_left)
- if not (left) then
- error("left hand side of addition: " .. tostring(_left) .. ": " .. tostring(err))
- end
- local right
- right, err = coerce_literal(_right)
- if not (right) then
- error("right hand side of addition: " .. tostring(_right) .. ": " .. tostring(err))
- end
- if left.__class == FirstOfNode then
- local options = {
- unpack(left.options)
- }
- table.insert(options, right)
- return FirstOfNode(unpack(options))
- elseif right.__class == FirstOfNode then
- return FirstOfNode(left, unpack(right.options))
- else
- return FirstOfNode(left, right)
- end
- end,
- __unm = function(self, right)
- return NotType(right)
- end,
- __tostring = function(self)
- return self:_describe()
- end,
- _describe = function(self)
- return error("Node missing _describe: " .. tostring(self.__class.__name))
- end,
- check_value = function(self, ...)
- local value, state_or_err = self:_transform(...)
- if value == FailedTransform then
- return nil, state_or_err
- end
- if type(state_or_err) == "table" then
- return state_or_err
- else
- return true
- end
- end,
- transform = function(self, ...)
- local value, state_or_err = self:_transform(...)
- if value == FailedTransform then
- return nil, state_or_err
- end
- if type(state_or_err) == "table" then
- return value, state_or_err
- else
- return value
- end
- end,
- repair = function(self, ...)
- return self:transform(...)
- end,
- on_repair = function(self, fn)
- return (self + types.any / fn * self):describe(function()
- return self:_describe()
- end)
- end,
- is_optional = function(self)
- return OptionalType(self)
- end,
- describe = function(self, ...)
- return DescribeNode(self, ...)
- end,
- tag = function(self, name)
- return TaggedType(self, {
- tag = name
- })
- end,
- clone_opts = function(self)
- return error("clone_opts is not longer supported")
- end,
- __call = function(self, ...)
- return self:check_value(...)
- end
- }
- _base_0.__index = _base_0
- _class_0 = setmetatable({
- __init = function(self, opts) end,
- __base = _base_0,
- __name = "BaseType"
- }, {
- __index = _base_0,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- local self = _class_0
- self.is_base_type = function(self, val)
- do
- local mt = type(val) == "table" and getmetatable(val)
- if mt then
- if mt.__class then
- return mt.__class.is_base_type == BaseType.is_base_type
- end
- end
- end
- return false
- end
- self.__inherited = function(self, cls)
- cls.__base.__call = cls.__call
- cls.__base.__div = self.__div
- cls.__base.__mod = self.__mod
- cls.__base.__mul = self.__mul
- cls.__base.__add = self.__add
- cls.__base.__unm = self.__unm
- cls.__base.__tostring = self.__tostring
- end
- BaseType = _class_0
- end
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- return self.node:_describe()
- end,
- _transform = function(self, value, state)
- local state_or_err
- value, state_or_err = self.node:_transform(value, state)
- if value == FailedTransform then
- return FailedTransform, state_or_err
- else
- local out
- local _exp_0 = type(self.t_fn)
- if "function" == _exp_0 then
- if self.with_state then
- out = self.t_fn(value, state_or_err)
- else
- out = self.t_fn(value)
- end
- else
- out = self.t_fn
- end
- return out, state_or_err
- end
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, node, t_fn)
- self.node, self.t_fn = node, t_fn
- return assert(self.node, "missing node for transform")
- end,
- __base = _base_0,
- __name = "TransformNode",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- TransformNode = _class_0
- end
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- local item_names
- do
- local _accum_0 = { }
- local _len_0 = 1
- local _list_0 = self.sequence
- for _index_0 = 1, #_list_0 do
- local i = _list_0[_index_0]
- _accum_0[_len_0] = describe_type(i)
- _len_0 = _len_0 + 1
- end
- item_names = _accum_0
- end
- return join_names(item_names, " then ")
- end,
- _transform = function(self, value, state)
- local _list_0 = self.sequence
- for _index_0 = 1, #_list_0 do
- local node = _list_0[_index_0]
- value, state = node:_transform(value, state)
- if value == FailedTransform then
- break
- end
- end
- return value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, ...)
- self.sequence = {
- ...
- }
- end,
- __base = _base_0,
- __name = "SequenceNode",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- SequenceNode = _class_0
- end
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- local item_names
- do
- local _accum_0 = { }
- local _len_0 = 1
- local _list_0 = self.options
- for _index_0 = 1, #_list_0 do
- local i = _list_0[_index_0]
- _accum_0[_len_0] = describe_type(i)
- _len_0 = _len_0 + 1
- end
- item_names = _accum_0
- end
- return join_names(item_names, ", ", ", or ")
- end,
- _transform = function(self, value, state)
- if not (self.options[1]) then
- return FailedTransform, "no options for node"
- end
- local _list_0 = self.options
- for _index_0 = 1, #_list_0 do
- local node = _list_0[_index_0]
- local new_val, new_state = node:_transform(value, state)
- if not (new_val == FailedTransform) then
- return new_val, new_state
- end
- end
- return FailedTransform, "expected " .. tostring(self:_describe())
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, ...)
- self.options = {
- ...
- }
- end,
- __base = _base_0,
- __name = "FirstOfNode",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- FirstOfNode = _class_0
- end
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _transform = function(self, input, ...)
- local value, state = self.node:_transform(input, ...)
- if value == FailedTransform then
- local err
- if self.err_handler then
- err = self.err_handler(input, state)
- else
- err = "expected " .. tostring(self:_describe())
- end
- return FailedTransform, err
- end
- return value, state
- end,
- describe = function(self, ...)
- return DescribeNode(self.node, ...)
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, node, describe)
- self.node = node
- local err_message
- if type(describe) == "table" then
- describe, err_message = describe.type, describe.error
- end
- if type(describe) == "string" then
- self._describe = function()
- return describe
- end
- else
- self._describe = describe
- end
- if err_message then
- if type(err_message) == "string" then
- self.err_handler = function()
- return err_message
- end
- else
- self.err_handler = err_message
- end
- end
- end,
- __base = _base_0,
- __name = "DescribeNode",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- DescribeNode = _class_0
- end
- local AnnotateNode
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- format_error = function(self, value, err)
- return tostring(tostring(value)) .. ": " .. tostring(err)
- end,
- _transform = function(self, value, state)
- local new_value, state_or_err = self.base_type:_transform(value, state)
- if new_value == FailedTransform then
- return FailedTransform, self:format_error(value, state_or_err)
- else
- return new_value, state_or_err
- end
- end,
- _describe = function(self)
- if self.base_type._describe then
- return self.base_type:_describe()
- end
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, base_type, opts)
- self.base_type = assert(coerce_literal(base_type))
- if opts then
- if opts.format_error then
- self.format_error = assert(types.func:transform(opts.format_error))
- end
- end
- end,
- __base = _base_0,
- __name = "AnnotateNode",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- AnnotateNode = _class_0
- end
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- update_state = function(self, state, value, ...)
- local out = clone_state(state)
- if self.tag_type == "function" then
- if select("#", ...) > 0 then
- self.tag_name(out, ..., value)
- else
- self.tag_name(out, value)
- end
- else
- if self.tag_array then
- local existing = out[self.tag_name]
- if type(existing) == "table" then
- local copy
- do
- local _tbl_0 = { }
- for k, v in pairs(existing) do
- _tbl_0[k] = v
- end
- copy = _tbl_0
- end
- table.insert(copy, value)
- out[self.tag_name] = copy
- else
- out[self.tag_name] = {
- value
- }
- end
- else
- out[self.tag_name] = value
- end
- end
- return out
- end,
- _transform = function(self, value, state)
- value, state = self.base_type:_transform(value, state)
- if value == FailedTransform then
- return FailedTransform, state
- end
- state = self:update_state(state, value)
- return value, state
- end,
- _describe = function(self)
- local base_description = self.base_type:_describe()
- return tostring(base_description) .. " tagged " .. tostring(describe_type(self.tag_name))
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, base_type, opts)
- if opts == nil then
- opts = { }
- end
- self.base_type = base_type
- self.tag_name = assert(opts.tag, "tagged type missing tag")
- self.tag_type = type(self.tag_name)
- if self.tag_type == "string" then
- if self.tag_name:match("%[%]$") then
- self.tag_name = self.tag_name:sub(1, -3)
- self.tag_array = true
- end
- end
- end,
- __base = _base_0,
- __name = "TaggedType",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- TaggedType = _class_0
- end
- local TagScopeType
- do
- local _class_0
- local _parent_0 = TaggedType
- local _base_0 = {
- create_scope_state = function(self, state)
- return nil
- end,
- _transform = function(self, value, state)
- local scope
- value, scope = self.base_type:_transform(value, self:create_scope_state(state))
- if value == FailedTransform then
- return FailedTransform, scope
- end
- if self.tag_name then
- state = self:update_state(state, scope, value)
- end
- return value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, base_type, opts)
- if opts then
- return _class_0.__parent.__init(self, base_type, opts)
- else
- self.base_type = base_type
- end
- end,
- __base = _base_0,
- __name = "TagScopeType",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- TagScopeType = _class_0
- end
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _transform = function(self, value, state)
- if value == nil then
- return value, state
- end
- return self.base_type:_transform(value, state)
- end,
- is_optional = function(self)
- return self
- end,
- _describe = function(self)
- if self.base_type._describe then
- local base_description = self.base_type:_describe()
- return "optional " .. tostring(base_description)
- end
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, base_type)
- self.base_type = base_type
- return assert(BaseType:is_base_type(self.base_type), "expected a type checker")
- end,
- __base = _base_0,
- __name = "OptionalType",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- OptionalType = _class_0
- end
- local AnyType
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _transform = function(self, v, state)
- return v, state
- end,
- _describe = function(self)
- return "anything"
- end,
- is_optional = function(self)
- return self
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, ...)
- return _class_0.__parent.__init(self, ...)
- end,
- __base = _base_0,
- __name = "AnyType",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- AnyType = _class_0
- end
- local Type
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _transform = function(self, value, state)
- local got = type(value)
- if self.t ~= got then
- return FailedTransform, "expected type " .. tostring(describe_type(self.t)) .. ", got " .. tostring(describe_type(got))
- end
- if self.length_type then
- local len = #value
- local res
- res, state = self.length_type:_transform(len, state)
- if res == FailedTransform then
- return FailedTransform, tostring(self.t) .. " length " .. tostring(state) .. ", got " .. tostring(len)
- end
- end
- return value, state
- end,
- length = function(self, left, right)
- local l
- if BaseType:is_base_type(left) then
- l = left
- else
- l = types.range(left, right)
- end
- return Type(self.t, {
- length = l
- })
- end,
- _describe = function(self)
- local t = "type " .. tostring(describe_type(self.t))
- if self.length_type then
- t = t .. " length_type " .. tostring(self.length_type:_describe())
- end
- return t
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, t, opts)
- self.t = t
- if opts then
- if opts.length then
- self.length_type = assert(coerce_literal(opts.length))
- end
- end
- end,
- __base = _base_0,
- __name = "Type",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- Type = _class_0
- end
- local ArrayType
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- return "an array"
- end,
- _transform = function(self, value, state)
- if not (type(value) == "table") then
- return FailedTransform, "expecting table"
- end
- local k = 1
- for i, v in pairs(value) do
- if not (type(i) == "number") then
- return FailedTransform, "non number field: " .. tostring(i)
- end
- if not (i == k) then
- return FailedTransform, "non array index, got " .. tostring(describe_type(i)) .. " but expected " .. tostring(describe_type(k))
- end
- k = k + 1
- end
- return value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, ...)
- return _class_0.__parent.__init(self, ...)
- end,
- __base = _base_0,
- __name = "ArrayType",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- ArrayType = _class_0
- end
- local OneOf
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- local item_names
- do
- local _accum_0 = { }
- local _len_0 = 1
- local _list_0 = self.options
- for _index_0 = 1, #_list_0 do
- local i = _list_0[_index_0]
- if type(i) == "table" and i._describe then
- _accum_0[_len_0] = i:_describe()
- else
- _accum_0[_len_0] = describe_type(i)
- end
- _len_0 = _len_0 + 1
- end
- item_names = _accum_0
- end
- return tostring(join_names(item_names, ", ", ", or "))
- end,
- _transform = function(self, value, state)
- if self.options_hash then
- if self.options_hash[value] then
- return value, state
- end
- else
- local _list_0 = self.options
- for _index_0 = 1, #_list_0 do
- local _continue_0 = false
- repeat
- local item = _list_0[_index_0]
- if item == value then
- return value, state
- end
- if BaseType:is_base_type(item) then
- local new_value, new_state = item:_transform(value, state)
- if new_value == FailedTransform then
- _continue_0 = true
- break
- end
- return new_value, new_state
- end
- _continue_0 = true
- until true
- if not _continue_0 then
- break
- end
- end
- end
- return FailedTransform, "expected " .. tostring(self:_describe())
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, options)
- self.options = options
- assert(type(self.options) == "table", "expected table for options in one_of")
- local fast_opts = types.array_of(types.number + types.string)
- if fast_opts(self.options) then
- do
- local _tbl_0 = { }
- local _list_0 = self.options
- for _index_0 = 1, #_list_0 do
- local v = _list_0[_index_0]
- _tbl_0[v] = true
- end
- self.options_hash = _tbl_0
- end
- end
- end,
- __base = _base_0,
- __name = "OneOf",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- OneOf = _class_0
- end
- local AllOf
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- local item_names
- do
- local _accum_0 = { }
- local _len_0 = 1
- local _list_0 = self.types
- for _index_0 = 1, #_list_0 do
- local i = _list_0[_index_0]
- _accum_0[_len_0] = describe_type(i)
- _len_0 = _len_0 + 1
- end
- item_names = _accum_0
- end
- return join_names(item_names, " and ")
- end,
- _transform = function(self, value, state)
- local _list_0 = self.types
- for _index_0 = 1, #_list_0 do
- local t = _list_0[_index_0]
- value, state = t:_transform(value, state)
- if value == FailedTransform then
- return FailedTransform, state
- end
- end
- return value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, types)
- self.types = types
- assert(type(self.types) == "table", "expected table for first argument")
- local _list_0 = self.types
- for _index_0 = 1, #_list_0 do
- local checker = _list_0[_index_0]
- assert(BaseType:is_base_type(checker), "all_of expects all type checkers")
- end
- end,
- __base = _base_0,
- __name = "AllOf",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- AllOf = _class_0
- end
- local ArrayOf
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- return "array of " .. tostring(describe_type(self.expected))
- end,
- _transform = function(self, value, state)
- local pass, err = types.table(value)
- if not (pass) then
- return FailedTransform, err
- end
- if self.length_type then
- local len = #value
- local res
- res, state = self.length_type:_transform(len, state)
- if res == FailedTransform then
- return FailedTransform, "array length " .. tostring(state) .. ", got " .. tostring(len)
- end
- end
- local is_literal = not BaseType:is_base_type(self.expected)
- local copy, k
- for idx, item in ipairs(value) do
- local skip_item = false
- local transformed_item
- if is_literal then
- if self.expected ~= item then
- return FailedTransform, "array item " .. tostring(idx) .. ": expected " .. tostring(describe_type(self.expected))
- else
- transformed_item = item
- end
- else
- local item_val
- item_val, state = self.expected:_transform(item, state)
- if item_val == FailedTransform then
- return FailedTransform, "array item " .. tostring(idx) .. ": " .. tostring(state)
- end
- if item_val == nil and not self.keep_nils then
- skip_item = true
- else
- transformed_item = item_val
- end
- end
- if transformed_item ~= item or skip_item then
- if not (copy) then
- do
- local _accum_0 = { }
- local _len_0 = 1
- local _max_0 = idx - 1
- for _index_0 = 1, _max_0 < 0 and #value + _max_0 or _max_0 do
- local i = value[_index_0]
- _accum_0[_len_0] = i
- _len_0 = _len_0 + 1
- end
- copy = _accum_0
- end
- k = idx
- end
- end
- if copy and not skip_item then
- copy[k] = transformed_item
- k = k + 1
- end
- end
- return copy or value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, expected, opts)
- self.expected = expected
- if opts then
- self.keep_nils = opts.keep_nils and true
- if opts.length then
- self.length_type = assert(coerce_literal(opts.length))
- end
- end
- end,
- __base = _base_0,
- __name = "ArrayOf",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- local self = _class_0
- self.type_err_message = "expecting table"
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- ArrayOf = _class_0
- end
- local ArrayContains
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- short_circuit = true,
- keep_nils = false,
- _describe = function(self)
- return "array containing " .. tostring(describe_type(self.contains))
- end,
- _transform = function(self, value, state)
- local pass, err = types.table(value)
- if not (pass) then
- return FailedTransform, err
- end
- local is_literal = not BaseType:is_base_type(self.contains)
- local contains = false
- local copy, k
- for idx, item in ipairs(value) do
- local skip_item = false
- local transformed_item
- if is_literal then
- if self.contains == item then
- contains = true
- end
- transformed_item = item
- else
- local item_val, new_state = self.contains:_transform(item, state)
- if item_val == FailedTransform then
- transformed_item = item
- else
- state = new_state
- contains = true
- if item_val == nil and not self.keep_nils then
- skip_item = true
- else
- transformed_item = item_val
- end
- end
- end
- if transformed_item ~= item or skip_item then
- if not (copy) then
- do
- local _accum_0 = { }
- local _len_0 = 1
- local _max_0 = idx - 1
- for _index_0 = 1, _max_0 < 0 and #value + _max_0 or _max_0 do
- local i = value[_index_0]
- _accum_0[_len_0] = i
- _len_0 = _len_0 + 1
- end
- copy = _accum_0
- end
- k = idx
- end
- end
- if copy and not skip_item then
- copy[k] = transformed_item
- k = k + 1
- end
- if contains and self.short_circuit then
- if copy then
- for kdx = idx + 1, #value do
- copy[k] = value[kdx]
- k = k + 1
- end
- end
- break
- end
- end
- if not (contains) then
- return FailedTransform, "expected " .. tostring(self:_describe())
- end
- return copy or value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, contains, opts)
- self.contains = contains
- assert(self.contains, "missing contains")
- if opts then
- self.short_circuit = opts.short_circuit and true
- self.keep_nils = opts.keep_nils and true
- end
- end,
- __base = _base_0,
- __name = "ArrayContains",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- local self = _class_0
- self.type_err_message = "expecting table"
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- ArrayContains = _class_0
- end
- local MapOf
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- return "map of " .. tostring(self.expected_key:_describe()) .. " -> " .. tostring(self.expected_value:_describe())
- end,
- _transform = function(self, value, state)
- local pass, err = types.table(value)
- if not (pass) then
- return FailedTransform, err
- end
- local key_literal = not BaseType:is_base_type(self.expected_key)
- local value_literal = not BaseType:is_base_type(self.expected_value)
- local transformed = false
- local out = { }
- for k, v in pairs(value) do
- local _continue_0 = false
- repeat
- local new_k = k
- local new_v = v
- if key_literal then
- if k ~= self.expected_key then
- return FailedTransform, "map key expected " .. tostring(describe_type(self.expected_key))
- end
- else
- new_k, state = self.expected_key:_transform(k, state)
- if new_k == FailedTransform then
- return FailedTransform, "map key " .. tostring(state)
- end
- end
- if value_literal then
- if v ~= self.expected_value then
- return FailedTransform, "map value expected " .. tostring(describe_type(self.expected_value))
- end
- else
- new_v, state = self.expected_value:_transform(v, state)
- if new_v == FailedTransform then
- return FailedTransform, "map value " .. tostring(state)
- end
- end
- if new_k ~= k or new_v ~= v then
- transformed = true
- end
- if new_k == nil then
- _continue_0 = true
- break
- end
- out[new_k] = new_v
- _continue_0 = true
- until true
- if not _continue_0 then
- break
- end
- end
- return transformed and out or value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, expected_key, expected_value)
- self.expected_key = coerce_literal(expected_key)
- self.expected_value = coerce_literal(expected_value)
- end,
- __base = _base_0,
- __name = "MapOf",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- MapOf = _class_0
- end
- local Shape
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- open = false,
- check_all = false,
- is_open = function(self)
- return Shape(self.shape, {
- open = true,
- check_all = self.check_all or nil
- })
- end,
- _describe = function(self)
- local parts
- do
- local _accum_0 = { }
- local _len_0 = 1
- for k, v in pairs(self.shape) do
- _accum_0[_len_0] = tostring(describe_type(k)) .. " = " .. tostring(describe_type(v))
- _len_0 = _len_0 + 1
- end
- parts = _accum_0
- end
- return "{ " .. tostring(table.concat(parts, ", ")) .. " }"
- end,
- _transform = function(self, value, state)
- local pass, err = types.table(value)
- if not (pass) then
- return FailedTransform, err
- end
- local check_all = self.check_all
- local remaining_keys
- do
- local _tbl_0 = { }
- for key in pairs(value) do
- _tbl_0[key] = true
- end
- remaining_keys = _tbl_0
- end
- local errors
- local dirty = false
- local out = { }
- for shape_key, shape_val in pairs(self.shape) do
- local item_value = value[shape_key]
- if remaining_keys then
- remaining_keys[shape_key] = nil
- end
- local new_val
- if BaseType:is_base_type(shape_val) then
- new_val, state = shape_val:_transform(item_value, state)
- else
- if shape_val == item_value then
- new_val, state = item_value, state
- else
- new_val, state = FailedTransform, "expected " .. tostring(describe_type(shape_val))
- end
- end
- if new_val == FailedTransform then
- err = "field " .. tostring(describe_type(shape_key)) .. ": " .. tostring(state)
- if check_all then
- if errors then
- table.insert(errors, err)
- else
- errors = {
- err
- }
- end
- else
- return FailedTransform, err
- end
- else
- if new_val ~= item_value then
- dirty = true
- end
- out[shape_key] = new_val
- end
- end
- if remaining_keys and next(remaining_keys) then
- if self.open then
- for k in pairs(remaining_keys) do
- out[k] = value[k]
- end
- elseif self.extra_fields_type then
- for k in pairs(remaining_keys) do
- local item_value = value[k]
- local tuple
- tuple, state = self.extra_fields_type:_transform({
- [k] = item_value
- }, state)
- if tuple == FailedTransform then
- err = "field " .. tostring(describe_type(k)) .. ": " .. tostring(state)
- if check_all then
- if errors then
- table.insert(errors, err)
- else
- errors = {
- err
- }
- end
- else
- return FailedTransform, err
- end
- else
- do
- local nk = tuple and next(tuple)
- if nk then
- if nk ~= k then
- dirty = true
- elseif tuple[nk] ~= item_value then
- dirty = true
- end
- out[nk] = tuple[nk]
- else
- dirty = true
- end
- end
- end
- end
- else
- local names
- do
- local _accum_0 = { }
- local _len_0 = 1
- for key in pairs(remaining_keys) do
- _accum_0[_len_0] = describe_type(key)
- _len_0 = _len_0 + 1
- end
- names = _accum_0
- end
- err = "extra fields: " .. tostring(table.concat(names, ", "))
- if check_all then
- if errors then
- table.insert(errors, err)
- else
- errors = {
- err
- }
- end
- else
- return FailedTransform, err
- end
- end
- end
- if errors and next(errors) then
- return FailedTransform, table.concat(errors, "; ")
- end
- return dirty and out or value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, shape, opts)
- self.shape = shape
- assert(type(self.shape) == "table", "expected table for shape")
- if opts then
- if opts.extra_fields then
- assert(BaseType:is_base_type(opts.extra_fields), "extra_fields_type must be type checker")
- self.extra_fields_type = opts.extra_fields
- end
- self.open = opts.open and true
- self.check_all = opts.check_all and true
- if self.open then
- assert(not self.extra_fields_type, "open can not be combined with extra_fields")
- end
- if self.extra_fields_type then
- return assert(not self.open, "extra_fields can not be combined with open")
- end
- end
- end,
- __base = _base_0,
- __name = "Shape",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- local self = _class_0
- self.type_err_message = "expecting table"
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- Shape = _class_0
- end
- local Partial
- do
- local _class_0
- local _parent_0 = Shape
- local _base_0 = {
- open = true,
- is_open = function(self)
- return error("is_open has no effect on Partial")
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, ...)
- return _class_0.__parent.__init(self, ...)
- end,
- __base = _base_0,
- __name = "Partial",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- Partial = _class_0
- end
- local Pattern
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- return "pattern " .. tostring(describe_type(self.pattern))
- end,
- _transform = function(self, value, state)
- local test_value
- if self.coerce then
- if BaseType:is_base_type(self.coerce) then
- local c_res, err = self.coerce:_transform(value)
- if c_res == FailedTransform then
- return FailedTransform, err
- end
- test_value = c_res
- else
- test_value = tostring(value)
- end
- else
- test_value = value
- end
- local t_res, err = types.string(test_value)
- if not (t_res) then
- return FailedTransform, err
- end
- if test_value:match(self.pattern) then
- return value, state
- else
- return FailedTransform, "doesn't match " .. tostring(self:_describe())
- end
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, pattern, opts)
- self.pattern = pattern
- assert(type(self.pattern) == "string", "Pattern must be a string")
- if opts then
- self.coerce = opts.coerce
- return assert(opts.initial_type == nil, "initial_type has been removed from types.pattern (got: " .. tostring(opts.initial_type) .. ")")
- end
- end,
- __base = _base_0,
- __name = "Pattern",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- Pattern = _class_0
- end
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- return describe_type(self.value)
- end,
- _transform = function(self, value, state)
- if self.value ~= value then
- return FailedTransform, "expected " .. tostring(self:_describe())
- end
- return value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, value)
- self.value = value
- end,
- __base = _base_0,
- __name = "Literal",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- Literal = _class_0
- end
- local Custom
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- return "custom checker " .. tostring(self.fn)
- end,
- _transform = function(self, value, state)
- local pass, err = self.fn(value, state)
- if not (pass) then
- return FailedTransform, err or "failed custom check"
- end
- return value, state
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, fn)
- self.fn = fn
- return assert(type(self.fn) == "function", "custom checker must be a function")
- end,
- __base = _base_0,
- __name = "Custom",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- Custom = _class_0
- end
- local Equivalent
- do
- local _class_0
- local values_equivalent
- local _parent_0 = BaseType
- local _base_0 = {
- _describe = function(self)
- return "equivalent to " .. tostring(describe_type(self.val))
- end,
- _transform = function(self, value, state)
- if values_equivalent(self.val, value) then
- return value, state
- else
- return FailedTransform, "not equivalent to " .. tostring(self.val)
- end
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, val)
- self.val = val
- end,
- __base = _base_0,
- __name = "Equivalent",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- local self = _class_0
- values_equivalent = function(a, b)
- if a == b then
- return true
- end
- if type(a) == "table" and type(b) == "table" then
- local seen_keys = { }
- for k, v in pairs(a) do
- seen_keys[k] = true
- if not (values_equivalent(v, b[k])) then
- return false
- end
- end
- for k, v in pairs(b) do
- local _continue_0 = false
- repeat
- if seen_keys[k] then
- _continue_0 = true
- break
- end
- if not (values_equivalent(v, a[k])) then
- return false
- end
- _continue_0 = true
- until true
- if not _continue_0 then
- break
- end
- end
- return true
- else
- return false
- end
- end
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- Equivalent = _class_0
- end
- local Range
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _transform = function(self, value, state)
- local res
- res, state = self.value_type:_transform(value, state)
- if res == FailedTransform then
- return FailedTransform, "range " .. tostring(state)
- end
- if value < self.left then
- return FailedTransform, "not in " .. tostring(self:_describe())
- end
- if value > self.right then
- return FailedTransform, "not in " .. tostring(self:_describe())
- end
- return value, state
- end,
- _describe = function(self)
- return "range from " .. tostring(self.left) .. " to " .. tostring(self.right)
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, left, right)
- self.left, self.right = left, right
- assert(self.left <= self.right, "left range value should be less than right range value")
- self.value_type = assert(types[type(self.left)], "couldn't figure out type of range boundary")
- end,
- __base = _base_0,
- __name = "Range",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- Range = _class_0
- end
- local Proxy
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _transform = function(self, ...)
- return assert(self.fn(), "proxy missing transformer"):_transform(...)
- end,
- _describe = function(self, ...)
- return assert(self.fn(), "proxy missing transformer"):_describe(...)
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, fn)
- self.fn = fn
- end,
- __base = _base_0,
- __name = "Proxy",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- Proxy = _class_0
- end
- local AssertType
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- assert = assert,
- _transform = function(self, value, state)
- local state_or_err
- value, state_or_err = self.base_type:_transform(value, state)
- self.assert(value ~= FailedTransform, state_or_err)
- return value, state_or_err
- end,
- _describe = function(self)
- if self.base_type._describe then
- local base_description = self.base_type:_describe()
- return "assert " .. tostring(base_description)
- end
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, base_type)
- self.base_type = base_type
- return assert(BaseType:is_base_type(self.base_type), "expected a type checker")
- end,
- __base = _base_0,
- __name = "AssertType",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- AssertType = _class_0
- end
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _transform = function(self, value, state)
- local out, _ = self.base_type:_transform(value, state)
- if out == FailedTransform then
- return value, state
- else
- return FailedTransform, "expected " .. tostring(self:_describe())
- end
- end,
- _describe = function(self)
- if self.base_type._describe then
- local base_description = self.base_type:_describe()
- return "not " .. tostring(base_description)
- end
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, base_type)
- self.base_type = base_type
- return assert(BaseType:is_base_type(self.base_type), "expected a type checker")
- end,
- __base = _base_0,
- __name = "NotType",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- NotType = _class_0
- end
- local CloneType
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- _transform = function(self, value, state)
- local _exp_0 = type(value)
- if "nil" == _exp_0 or "string" == _exp_0 or "number" == _exp_0 or "boolean" == _exp_0 then
- return value, state
- elseif "table" == _exp_0 then
- local clone_value
- do
- local _tbl_0 = { }
- for k, v in pairs(value) do
- _tbl_0[k] = v
- end
- clone_value = _tbl_0
- end
- do
- local mt = getmetatable(value)
- if mt then
- setmetatable(clone_value, mt)
- end
- end
- return clone_value, state
- else
- return FailedTransform, tostring(describe_type(value)) .. " is not cloneable"
- end
- end,
- _describe = function(self)
- return "cloneable value"
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, ...)
- return _class_0.__parent.__init(self, ...)
- end,
- __base = _base_0,
- __name = "CloneType",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- CloneType = _class_0
- end
- local MetatableIsType
- do
- local _class_0
- local _parent_0 = BaseType
- local _base_0 = {
- allow_metatable_update = false,
- _transform = function(self, value, state)
- local state_or_err
- value, state_or_err = types.table:_transform(value, state)
- if value == FailedTransform then
- return FailedTransform, state_or_err
- end
- local mt = getmetatable(value)
- local new_mt
- new_mt, state_or_err = self.metatable_type:_transform(mt, state_or_err)
- if new_mt == FailedTransform then
- return FailedTransform, "metatable expected: " .. tostring(state_or_err)
- end
- if new_mt ~= mt then
- if self.allow_metatable_update then
- setmetatable(value, new_mt)
- else
- return FailedTransform, "metatable was modified by a type but { allow_metatable_update = true } is not enabled"
- end
- end
- return value, state_or_err
- end,
- _describe = function(self)
- return "has metatable " .. tostring(describe_type(self.metatable_type))
- end
- }
- _base_0.__index = _base_0
- setmetatable(_base_0, _parent_0.__base)
- _class_0 = setmetatable({
- __init = function(self, metatable_type, opts)
- if BaseType:is_base_type(metatable_type) then
- self.metatable_type = metatable_type
- else
- self.metatable_type = Literal(metatable_type)
- end
- if opts then
- self.allow_metatable_update = opts.allow_metatable_update and true
- end
- end,
- __base = _base_0,
- __name = "MetatableIsType",
- __parent = _parent_0
- }, {
- __index = function(cls, name)
- local val = rawget(_base_0, name)
- if val == nil then
- local parent = rawget(cls, "__parent")
- if parent then
- return parent[name]
- end
- else
- return val
- end
- end,
- __call = function(cls, ...)
- local _self_0 = setmetatable({}, _base_0)
- cls.__init(_self_0, ...)
- return _self_0
- end
- })
- _base_0.__class = _class_0
- if _parent_0.__inherited then
- _parent_0.__inherited(_parent_0, _class_0)
- end
- MetatableIsType = _class_0
- end
- local type_nil = Type("nil")
- local type_function = Type("function")
- local type_number = Type("number")
- types = setmetatable({
- any = AnyType(),
- string = Type("string"),
- number = type_number,
- ["function"] = type_function,
- func = type_function,
- boolean = Type("boolean"),
- userdata = Type("userdata"),
- ["nil"] = type_nil,
- null = type_nil,
- table = Type("table"),
- array = ArrayType(),
- clone = CloneType(),
- integer = Pattern("^%d+$", {
- coerce = type_number / tostring
- }),
- one_of = OneOf,
- all_of = AllOf,
- shape = Shape,
- partial = Partial,
- pattern = Pattern,
- array_of = ArrayOf,
- array_contains = ArrayContains,
- map_of = MapOf,
- literal = Literal,
- range = Range,
- equivalent = Equivalent,
- custom = Custom,
- scope = TagScopeType,
- proxy = Proxy,
- assert = AssertType,
- annotate = AnnotateNode,
- metatable_is = MetatableIsType
- }, {
- __index = function(self, fn_name)
- return error("Type checker does not exist: `" .. tostring(fn_name) .. "`")
- end
- })
- local check_shape
- check_shape = function(value, shape)
- assert(shape.check_value, "missing check_value method from shape")
- return shape:check_value(value)
- end
- is_type = function(val)
- return BaseType:is_base_type(val)
- end
- return {
- check_shape = check_shape,
- types = types,
- is_type = is_type,
- BaseType = BaseType,
- FailedTransform = FailedTransform,
- VERSION = "2.6.0"
- }
|