You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tableshape.lua 61KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324
  1. local OptionalType, TaggedType, types, is_type
  2. local BaseType, TransformNode, SequenceNode, FirstOfNode, DescribeNode, NotType, Literal
  3. local FailedTransform = { }
  4. local unpack = unpack or table.unpack
  5. local clone_state
  6. clone_state = function(state_obj)
  7. if type(state_obj) ~= "table" then
  8. return { }
  9. end
  10. local out
  11. do
  12. local _tbl_0 = { }
  13. for k, v in pairs(state_obj) do
  14. _tbl_0[k] = v
  15. end
  16. out = _tbl_0
  17. end
  18. do
  19. local mt = getmetatable(state_obj)
  20. if mt then
  21. setmetatable(out, mt)
  22. end
  23. end
  24. return out
  25. end
  26. local describe_type
  27. describe_type = function(val)
  28. if type(val) == "string" then
  29. if not val:match('"') then
  30. return "\"" .. tostring(val) .. "\""
  31. elseif not val:match("'") then
  32. return "'" .. tostring(val) .. "'"
  33. else
  34. return "`" .. tostring(val) .. "`"
  35. end
  36. elseif BaseType:is_base_type(val) then
  37. return val:_describe()
  38. else
  39. return tostring(val)
  40. end
  41. end
  42. local coerce_literal
  43. coerce_literal = function(value)
  44. local _exp_0 = type(value)
  45. if "string" == _exp_0 or "number" == _exp_0 or "boolean" == _exp_0 then
  46. return Literal(value)
  47. elseif "table" == _exp_0 then
  48. if BaseType:is_base_type(value) then
  49. return value
  50. end
  51. end
  52. return nil, "failed to coerce literal into type, use types.literal() to test for literal value"
  53. end
  54. local join_names
  55. join_names = function(items, sep, last_sep)
  56. if sep == nil then
  57. sep = ", "
  58. end
  59. local count = #items
  60. local chunks = { }
  61. for idx, name in ipairs(items) do
  62. if idx > 1 then
  63. local current_sep
  64. if idx == count then
  65. current_sep = last_sep or sep
  66. else
  67. current_sep = sep
  68. end
  69. table.insert(chunks, current_sep)
  70. end
  71. table.insert(chunks, name)
  72. end
  73. return table.concat(chunks)
  74. end
  75. do
  76. local _class_0
  77. local _base_0 = {
  78. __div = function(self, fn)
  79. return TransformNode(self, fn)
  80. end,
  81. __mod = function(self, fn)
  82. do
  83. local _with_0 = TransformNode(self, fn)
  84. _with_0.with_state = true
  85. return _with_0
  86. end
  87. end,
  88. __mul = function(_left, _right)
  89. local left, err = coerce_literal(_left)
  90. if not (left) then
  91. error("left hand side of multiplication: " .. tostring(_left) .. ": " .. tostring(err))
  92. end
  93. local right
  94. right, err = coerce_literal(_right)
  95. if not (right) then
  96. error("right hand side of multiplication: " .. tostring(_right) .. ": " .. tostring(err))
  97. end
  98. return SequenceNode(left, right)
  99. end,
  100. __add = function(_left, _right)
  101. local left, err = coerce_literal(_left)
  102. if not (left) then
  103. error("left hand side of addition: " .. tostring(_left) .. ": " .. tostring(err))
  104. end
  105. local right
  106. right, err = coerce_literal(_right)
  107. if not (right) then
  108. error("right hand side of addition: " .. tostring(_right) .. ": " .. tostring(err))
  109. end
  110. if left.__class == FirstOfNode then
  111. local options = {
  112. unpack(left.options)
  113. }
  114. table.insert(options, right)
  115. return FirstOfNode(unpack(options))
  116. elseif right.__class == FirstOfNode then
  117. return FirstOfNode(left, unpack(right.options))
  118. else
  119. return FirstOfNode(left, right)
  120. end
  121. end,
  122. __unm = function(self, right)
  123. return NotType(right)
  124. end,
  125. __tostring = function(self)
  126. return self:_describe()
  127. end,
  128. _describe = function(self)
  129. return error("Node missing _describe: " .. tostring(self.__class.__name))
  130. end,
  131. check_value = function(self, ...)
  132. local value, state_or_err = self:_transform(...)
  133. if value == FailedTransform then
  134. return nil, state_or_err
  135. end
  136. if type(state_or_err) == "table" then
  137. return state_or_err
  138. else
  139. return true
  140. end
  141. end,
  142. transform = function(self, ...)
  143. local value, state_or_err = self:_transform(...)
  144. if value == FailedTransform then
  145. return nil, state_or_err
  146. end
  147. if type(state_or_err) == "table" then
  148. return value, state_or_err
  149. else
  150. return value
  151. end
  152. end,
  153. repair = function(self, ...)
  154. return self:transform(...)
  155. end,
  156. on_repair = function(self, fn)
  157. return (self + types.any / fn * self):describe(function()
  158. return self:_describe()
  159. end)
  160. end,
  161. is_optional = function(self)
  162. return OptionalType(self)
  163. end,
  164. describe = function(self, ...)
  165. return DescribeNode(self, ...)
  166. end,
  167. tag = function(self, name)
  168. return TaggedType(self, {
  169. tag = name
  170. })
  171. end,
  172. clone_opts = function(self)
  173. return error("clone_opts is not longer supported")
  174. end,
  175. __call = function(self, ...)
  176. return self:check_value(...)
  177. end
  178. }
  179. _base_0.__index = _base_0
  180. _class_0 = setmetatable({
  181. __init = function(self, opts) end,
  182. __base = _base_0,
  183. __name = "BaseType"
  184. }, {
  185. __index = _base_0,
  186. __call = function(cls, ...)
  187. local _self_0 = setmetatable({}, _base_0)
  188. cls.__init(_self_0, ...)
  189. return _self_0
  190. end
  191. })
  192. _base_0.__class = _class_0
  193. local self = _class_0
  194. self.is_base_type = function(self, val)
  195. do
  196. local mt = type(val) == "table" and getmetatable(val)
  197. if mt then
  198. if mt.__class then
  199. return mt.__class.is_base_type == BaseType.is_base_type
  200. end
  201. end
  202. end
  203. return false
  204. end
  205. self.__inherited = function(self, cls)
  206. cls.__base.__call = cls.__call
  207. cls.__base.__div = self.__div
  208. cls.__base.__mod = self.__mod
  209. cls.__base.__mul = self.__mul
  210. cls.__base.__add = self.__add
  211. cls.__base.__unm = self.__unm
  212. cls.__base.__tostring = self.__tostring
  213. end
  214. BaseType = _class_0
  215. end
  216. do
  217. local _class_0
  218. local _parent_0 = BaseType
  219. local _base_0 = {
  220. _describe = function(self)
  221. return self.node:_describe()
  222. end,
  223. _transform = function(self, value, state)
  224. local state_or_err
  225. value, state_or_err = self.node:_transform(value, state)
  226. if value == FailedTransform then
  227. return FailedTransform, state_or_err
  228. else
  229. local out
  230. local _exp_0 = type(self.t_fn)
  231. if "function" == _exp_0 then
  232. if self.with_state then
  233. out = self.t_fn(value, state_or_err)
  234. else
  235. out = self.t_fn(value)
  236. end
  237. else
  238. out = self.t_fn
  239. end
  240. return out, state_or_err
  241. end
  242. end
  243. }
  244. _base_0.__index = _base_0
  245. setmetatable(_base_0, _parent_0.__base)
  246. _class_0 = setmetatable({
  247. __init = function(self, node, t_fn)
  248. self.node, self.t_fn = node, t_fn
  249. return assert(self.node, "missing node for transform")
  250. end,
  251. __base = _base_0,
  252. __name = "TransformNode",
  253. __parent = _parent_0
  254. }, {
  255. __index = function(cls, name)
  256. local val = rawget(_base_0, name)
  257. if val == nil then
  258. local parent = rawget(cls, "__parent")
  259. if parent then
  260. return parent[name]
  261. end
  262. else
  263. return val
  264. end
  265. end,
  266. __call = function(cls, ...)
  267. local _self_0 = setmetatable({}, _base_0)
  268. cls.__init(_self_0, ...)
  269. return _self_0
  270. end
  271. })
  272. _base_0.__class = _class_0
  273. if _parent_0.__inherited then
  274. _parent_0.__inherited(_parent_0, _class_0)
  275. end
  276. TransformNode = _class_0
  277. end
  278. do
  279. local _class_0
  280. local _parent_0 = BaseType
  281. local _base_0 = {
  282. _describe = function(self)
  283. local item_names
  284. do
  285. local _accum_0 = { }
  286. local _len_0 = 1
  287. local _list_0 = self.sequence
  288. for _index_0 = 1, #_list_0 do
  289. local i = _list_0[_index_0]
  290. _accum_0[_len_0] = describe_type(i)
  291. _len_0 = _len_0 + 1
  292. end
  293. item_names = _accum_0
  294. end
  295. return join_names(item_names, " then ")
  296. end,
  297. _transform = function(self, value, state)
  298. local _list_0 = self.sequence
  299. for _index_0 = 1, #_list_0 do
  300. local node = _list_0[_index_0]
  301. value, state = node:_transform(value, state)
  302. if value == FailedTransform then
  303. break
  304. end
  305. end
  306. return value, state
  307. end
  308. }
  309. _base_0.__index = _base_0
  310. setmetatable(_base_0, _parent_0.__base)
  311. _class_0 = setmetatable({
  312. __init = function(self, ...)
  313. self.sequence = {
  314. ...
  315. }
  316. end,
  317. __base = _base_0,
  318. __name = "SequenceNode",
  319. __parent = _parent_0
  320. }, {
  321. __index = function(cls, name)
  322. local val = rawget(_base_0, name)
  323. if val == nil then
  324. local parent = rawget(cls, "__parent")
  325. if parent then
  326. return parent[name]
  327. end
  328. else
  329. return val
  330. end
  331. end,
  332. __call = function(cls, ...)
  333. local _self_0 = setmetatable({}, _base_0)
  334. cls.__init(_self_0, ...)
  335. return _self_0
  336. end
  337. })
  338. _base_0.__class = _class_0
  339. if _parent_0.__inherited then
  340. _parent_0.__inherited(_parent_0, _class_0)
  341. end
  342. SequenceNode = _class_0
  343. end
  344. do
  345. local _class_0
  346. local _parent_0 = BaseType
  347. local _base_0 = {
  348. _describe = function(self)
  349. local item_names
  350. do
  351. local _accum_0 = { }
  352. local _len_0 = 1
  353. local _list_0 = self.options
  354. for _index_0 = 1, #_list_0 do
  355. local i = _list_0[_index_0]
  356. _accum_0[_len_0] = describe_type(i)
  357. _len_0 = _len_0 + 1
  358. end
  359. item_names = _accum_0
  360. end
  361. return join_names(item_names, ", ", ", or ")
  362. end,
  363. _transform = function(self, value, state)
  364. if not (self.options[1]) then
  365. return FailedTransform, "no options for node"
  366. end
  367. local _list_0 = self.options
  368. for _index_0 = 1, #_list_0 do
  369. local node = _list_0[_index_0]
  370. local new_val, new_state = node:_transform(value, state)
  371. if not (new_val == FailedTransform) then
  372. return new_val, new_state
  373. end
  374. end
  375. return FailedTransform, "expected " .. tostring(self:_describe())
  376. end
  377. }
  378. _base_0.__index = _base_0
  379. setmetatable(_base_0, _parent_0.__base)
  380. _class_0 = setmetatable({
  381. __init = function(self, ...)
  382. self.options = {
  383. ...
  384. }
  385. end,
  386. __base = _base_0,
  387. __name = "FirstOfNode",
  388. __parent = _parent_0
  389. }, {
  390. __index = function(cls, name)
  391. local val = rawget(_base_0, name)
  392. if val == nil then
  393. local parent = rawget(cls, "__parent")
  394. if parent then
  395. return parent[name]
  396. end
  397. else
  398. return val
  399. end
  400. end,
  401. __call = function(cls, ...)
  402. local _self_0 = setmetatable({}, _base_0)
  403. cls.__init(_self_0, ...)
  404. return _self_0
  405. end
  406. })
  407. _base_0.__class = _class_0
  408. if _parent_0.__inherited then
  409. _parent_0.__inherited(_parent_0, _class_0)
  410. end
  411. FirstOfNode = _class_0
  412. end
  413. do
  414. local _class_0
  415. local _parent_0 = BaseType
  416. local _base_0 = {
  417. _transform = function(self, input, ...)
  418. local value, state = self.node:_transform(input, ...)
  419. if value == FailedTransform then
  420. local err
  421. if self.err_handler then
  422. err = self.err_handler(input, state)
  423. else
  424. err = "expected " .. tostring(self:_describe())
  425. end
  426. return FailedTransform, err
  427. end
  428. return value, state
  429. end,
  430. describe = function(self, ...)
  431. return DescribeNode(self.node, ...)
  432. end
  433. }
  434. _base_0.__index = _base_0
  435. setmetatable(_base_0, _parent_0.__base)
  436. _class_0 = setmetatable({
  437. __init = function(self, node, describe)
  438. self.node = node
  439. local err_message
  440. if type(describe) == "table" then
  441. describe, err_message = describe.type, describe.error
  442. end
  443. if type(describe) == "string" then
  444. self._describe = function()
  445. return describe
  446. end
  447. else
  448. self._describe = describe
  449. end
  450. if err_message then
  451. if type(err_message) == "string" then
  452. self.err_handler = function()
  453. return err_message
  454. end
  455. else
  456. self.err_handler = err_message
  457. end
  458. end
  459. end,
  460. __base = _base_0,
  461. __name = "DescribeNode",
  462. __parent = _parent_0
  463. }, {
  464. __index = function(cls, name)
  465. local val = rawget(_base_0, name)
  466. if val == nil then
  467. local parent = rawget(cls, "__parent")
  468. if parent then
  469. return parent[name]
  470. end
  471. else
  472. return val
  473. end
  474. end,
  475. __call = function(cls, ...)
  476. local _self_0 = setmetatable({}, _base_0)
  477. cls.__init(_self_0, ...)
  478. return _self_0
  479. end
  480. })
  481. _base_0.__class = _class_0
  482. if _parent_0.__inherited then
  483. _parent_0.__inherited(_parent_0, _class_0)
  484. end
  485. DescribeNode = _class_0
  486. end
  487. local AnnotateNode
  488. do
  489. local _class_0
  490. local _parent_0 = BaseType
  491. local _base_0 = {
  492. format_error = function(self, value, err)
  493. return tostring(tostring(value)) .. ": " .. tostring(err)
  494. end,
  495. _transform = function(self, value, state)
  496. local new_value, state_or_err = self.base_type:_transform(value, state)
  497. if new_value == FailedTransform then
  498. return FailedTransform, self:format_error(value, state_or_err)
  499. else
  500. return new_value, state_or_err
  501. end
  502. end,
  503. _describe = function(self)
  504. if self.base_type._describe then
  505. return self.base_type:_describe()
  506. end
  507. end
  508. }
  509. _base_0.__index = _base_0
  510. setmetatable(_base_0, _parent_0.__base)
  511. _class_0 = setmetatable({
  512. __init = function(self, base_type, opts)
  513. self.base_type = assert(coerce_literal(base_type))
  514. if opts then
  515. if opts.format_error then
  516. self.format_error = assert(types.func:transform(opts.format_error))
  517. end
  518. end
  519. end,
  520. __base = _base_0,
  521. __name = "AnnotateNode",
  522. __parent = _parent_0
  523. }, {
  524. __index = function(cls, name)
  525. local val = rawget(_base_0, name)
  526. if val == nil then
  527. local parent = rawget(cls, "__parent")
  528. if parent then
  529. return parent[name]
  530. end
  531. else
  532. return val
  533. end
  534. end,
  535. __call = function(cls, ...)
  536. local _self_0 = setmetatable({}, _base_0)
  537. cls.__init(_self_0, ...)
  538. return _self_0
  539. end
  540. })
  541. _base_0.__class = _class_0
  542. if _parent_0.__inherited then
  543. _parent_0.__inherited(_parent_0, _class_0)
  544. end
  545. AnnotateNode = _class_0
  546. end
  547. do
  548. local _class_0
  549. local _parent_0 = BaseType
  550. local _base_0 = {
  551. update_state = function(self, state, value, ...)
  552. local out = clone_state(state)
  553. if self.tag_type == "function" then
  554. if select("#", ...) > 0 then
  555. self.tag_name(out, ..., value)
  556. else
  557. self.tag_name(out, value)
  558. end
  559. else
  560. if self.tag_array then
  561. local existing = out[self.tag_name]
  562. if type(existing) == "table" then
  563. local copy
  564. do
  565. local _tbl_0 = { }
  566. for k, v in pairs(existing) do
  567. _tbl_0[k] = v
  568. end
  569. copy = _tbl_0
  570. end
  571. table.insert(copy, value)
  572. out[self.tag_name] = copy
  573. else
  574. out[self.tag_name] = {
  575. value
  576. }
  577. end
  578. else
  579. out[self.tag_name] = value
  580. end
  581. end
  582. return out
  583. end,
  584. _transform = function(self, value, state)
  585. value, state = self.base_type:_transform(value, state)
  586. if value == FailedTransform then
  587. return FailedTransform, state
  588. end
  589. state = self:update_state(state, value)
  590. return value, state
  591. end,
  592. _describe = function(self)
  593. local base_description = self.base_type:_describe()
  594. return tostring(base_description) .. " tagged " .. tostring(describe_type(self.tag_name))
  595. end
  596. }
  597. _base_0.__index = _base_0
  598. setmetatable(_base_0, _parent_0.__base)
  599. _class_0 = setmetatable({
  600. __init = function(self, base_type, opts)
  601. if opts == nil then
  602. opts = { }
  603. end
  604. self.base_type = base_type
  605. self.tag_name = assert(opts.tag, "tagged type missing tag")
  606. self.tag_type = type(self.tag_name)
  607. if self.tag_type == "string" then
  608. if self.tag_name:match("%[%]$") then
  609. self.tag_name = self.tag_name:sub(1, -3)
  610. self.tag_array = true
  611. end
  612. end
  613. end,
  614. __base = _base_0,
  615. __name = "TaggedType",
  616. __parent = _parent_0
  617. }, {
  618. __index = function(cls, name)
  619. local val = rawget(_base_0, name)
  620. if val == nil then
  621. local parent = rawget(cls, "__parent")
  622. if parent then
  623. return parent[name]
  624. end
  625. else
  626. return val
  627. end
  628. end,
  629. __call = function(cls, ...)
  630. local _self_0 = setmetatable({}, _base_0)
  631. cls.__init(_self_0, ...)
  632. return _self_0
  633. end
  634. })
  635. _base_0.__class = _class_0
  636. if _parent_0.__inherited then
  637. _parent_0.__inherited(_parent_0, _class_0)
  638. end
  639. TaggedType = _class_0
  640. end
  641. local TagScopeType
  642. do
  643. local _class_0
  644. local _parent_0 = TaggedType
  645. local _base_0 = {
  646. create_scope_state = function(self, state)
  647. return nil
  648. end,
  649. _transform = function(self, value, state)
  650. local scope
  651. value, scope = self.base_type:_transform(value, self:create_scope_state(state))
  652. if value == FailedTransform then
  653. return FailedTransform, scope
  654. end
  655. if self.tag_name then
  656. state = self:update_state(state, scope, value)
  657. end
  658. return value, state
  659. end
  660. }
  661. _base_0.__index = _base_0
  662. setmetatable(_base_0, _parent_0.__base)
  663. _class_0 = setmetatable({
  664. __init = function(self, base_type, opts)
  665. if opts then
  666. return _class_0.__parent.__init(self, base_type, opts)
  667. else
  668. self.base_type = base_type
  669. end
  670. end,
  671. __base = _base_0,
  672. __name = "TagScopeType",
  673. __parent = _parent_0
  674. }, {
  675. __index = function(cls, name)
  676. local val = rawget(_base_0, name)
  677. if val == nil then
  678. local parent = rawget(cls, "__parent")
  679. if parent then
  680. return parent[name]
  681. end
  682. else
  683. return val
  684. end
  685. end,
  686. __call = function(cls, ...)
  687. local _self_0 = setmetatable({}, _base_0)
  688. cls.__init(_self_0, ...)
  689. return _self_0
  690. end
  691. })
  692. _base_0.__class = _class_0
  693. if _parent_0.__inherited then
  694. _parent_0.__inherited(_parent_0, _class_0)
  695. end
  696. TagScopeType = _class_0
  697. end
  698. do
  699. local _class_0
  700. local _parent_0 = BaseType
  701. local _base_0 = {
  702. _transform = function(self, value, state)
  703. if value == nil then
  704. return value, state
  705. end
  706. return self.base_type:_transform(value, state)
  707. end,
  708. is_optional = function(self)
  709. return self
  710. end,
  711. _describe = function(self)
  712. if self.base_type._describe then
  713. local base_description = self.base_type:_describe()
  714. return "optional " .. tostring(base_description)
  715. end
  716. end
  717. }
  718. _base_0.__index = _base_0
  719. setmetatable(_base_0, _parent_0.__base)
  720. _class_0 = setmetatable({
  721. __init = function(self, base_type)
  722. self.base_type = base_type
  723. return assert(BaseType:is_base_type(self.base_type), "expected a type checker")
  724. end,
  725. __base = _base_0,
  726. __name = "OptionalType",
  727. __parent = _parent_0
  728. }, {
  729. __index = function(cls, name)
  730. local val = rawget(_base_0, name)
  731. if val == nil then
  732. local parent = rawget(cls, "__parent")
  733. if parent then
  734. return parent[name]
  735. end
  736. else
  737. return val
  738. end
  739. end,
  740. __call = function(cls, ...)
  741. local _self_0 = setmetatable({}, _base_0)
  742. cls.__init(_self_0, ...)
  743. return _self_0
  744. end
  745. })
  746. _base_0.__class = _class_0
  747. if _parent_0.__inherited then
  748. _parent_0.__inherited(_parent_0, _class_0)
  749. end
  750. OptionalType = _class_0
  751. end
  752. local AnyType
  753. do
  754. local _class_0
  755. local _parent_0 = BaseType
  756. local _base_0 = {
  757. _transform = function(self, v, state)
  758. return v, state
  759. end,
  760. _describe = function(self)
  761. return "anything"
  762. end,
  763. is_optional = function(self)
  764. return self
  765. end
  766. }
  767. _base_0.__index = _base_0
  768. setmetatable(_base_0, _parent_0.__base)
  769. _class_0 = setmetatable({
  770. __init = function(self, ...)
  771. return _class_0.__parent.__init(self, ...)
  772. end,
  773. __base = _base_0,
  774. __name = "AnyType",
  775. __parent = _parent_0
  776. }, {
  777. __index = function(cls, name)
  778. local val = rawget(_base_0, name)
  779. if val == nil then
  780. local parent = rawget(cls, "__parent")
  781. if parent then
  782. return parent[name]
  783. end
  784. else
  785. return val
  786. end
  787. end,
  788. __call = function(cls, ...)
  789. local _self_0 = setmetatable({}, _base_0)
  790. cls.__init(_self_0, ...)
  791. return _self_0
  792. end
  793. })
  794. _base_0.__class = _class_0
  795. if _parent_0.__inherited then
  796. _parent_0.__inherited(_parent_0, _class_0)
  797. end
  798. AnyType = _class_0
  799. end
  800. local Type
  801. do
  802. local _class_0
  803. local _parent_0 = BaseType
  804. local _base_0 = {
  805. _transform = function(self, value, state)
  806. local got = type(value)
  807. if self.t ~= got then
  808. return FailedTransform, "expected type " .. tostring(describe_type(self.t)) .. ", got " .. tostring(describe_type(got))
  809. end
  810. if self.length_type then
  811. local len = #value
  812. local res
  813. res, state = self.length_type:_transform(len, state)
  814. if res == FailedTransform then
  815. return FailedTransform, tostring(self.t) .. " length " .. tostring(state) .. ", got " .. tostring(len)
  816. end
  817. end
  818. return value, state
  819. end,
  820. length = function(self, left, right)
  821. local l
  822. if BaseType:is_base_type(left) then
  823. l = left
  824. else
  825. l = types.range(left, right)
  826. end
  827. return Type(self.t, {
  828. length = l
  829. })
  830. end,
  831. _describe = function(self)
  832. local t = "type " .. tostring(describe_type(self.t))
  833. if self.length_type then
  834. t = t .. " length_type " .. tostring(self.length_type:_describe())
  835. end
  836. return t
  837. end
  838. }
  839. _base_0.__index = _base_0
  840. setmetatable(_base_0, _parent_0.__base)
  841. _class_0 = setmetatable({
  842. __init = function(self, t, opts)
  843. self.t = t
  844. if opts then
  845. if opts.length then
  846. self.length_type = assert(coerce_literal(opts.length))
  847. end
  848. end
  849. end,
  850. __base = _base_0,
  851. __name = "Type",
  852. __parent = _parent_0
  853. }, {
  854. __index = function(cls, name)
  855. local val = rawget(_base_0, name)
  856. if val == nil then
  857. local parent = rawget(cls, "__parent")
  858. if parent then
  859. return parent[name]
  860. end
  861. else
  862. return val
  863. end
  864. end,
  865. __call = function(cls, ...)
  866. local _self_0 = setmetatable({}, _base_0)
  867. cls.__init(_self_0, ...)
  868. return _self_0
  869. end
  870. })
  871. _base_0.__class = _class_0
  872. if _parent_0.__inherited then
  873. _parent_0.__inherited(_parent_0, _class_0)
  874. end
  875. Type = _class_0
  876. end
  877. local ArrayType
  878. do
  879. local _class_0
  880. local _parent_0 = BaseType
  881. local _base_0 = {
  882. _describe = function(self)
  883. return "an array"
  884. end,
  885. _transform = function(self, value, state)
  886. if not (type(value) == "table") then
  887. return FailedTransform, "expecting table"
  888. end
  889. local k = 1
  890. for i, v in pairs(value) do
  891. if not (type(i) == "number") then
  892. return FailedTransform, "non number field: " .. tostring(i)
  893. end
  894. if not (i == k) then
  895. return FailedTransform, "non array index, got " .. tostring(describe_type(i)) .. " but expected " .. tostring(describe_type(k))
  896. end
  897. k = k + 1
  898. end
  899. return value, state
  900. end
  901. }
  902. _base_0.__index = _base_0
  903. setmetatable(_base_0, _parent_0.__base)
  904. _class_0 = setmetatable({
  905. __init = function(self, ...)
  906. return _class_0.__parent.__init(self, ...)
  907. end,
  908. __base = _base_0,
  909. __name = "ArrayType",
  910. __parent = _parent_0
  911. }, {
  912. __index = function(cls, name)
  913. local val = rawget(_base_0, name)
  914. if val == nil then
  915. local parent = rawget(cls, "__parent")
  916. if parent then
  917. return parent[name]
  918. end
  919. else
  920. return val
  921. end
  922. end,
  923. __call = function(cls, ...)
  924. local _self_0 = setmetatable({}, _base_0)
  925. cls.__init(_self_0, ...)
  926. return _self_0
  927. end
  928. })
  929. _base_0.__class = _class_0
  930. if _parent_0.__inherited then
  931. _parent_0.__inherited(_parent_0, _class_0)
  932. end
  933. ArrayType = _class_0
  934. end
  935. local OneOf
  936. do
  937. local _class_0
  938. local _parent_0 = BaseType
  939. local _base_0 = {
  940. _describe = function(self)
  941. local item_names
  942. do
  943. local _accum_0 = { }
  944. local _len_0 = 1
  945. local _list_0 = self.options
  946. for _index_0 = 1, #_list_0 do
  947. local i = _list_0[_index_0]
  948. if type(i) == "table" and i._describe then
  949. _accum_0[_len_0] = i:_describe()
  950. else
  951. _accum_0[_len_0] = describe_type(i)
  952. end
  953. _len_0 = _len_0 + 1
  954. end
  955. item_names = _accum_0
  956. end
  957. return tostring(join_names(item_names, ", ", ", or "))
  958. end,
  959. _transform = function(self, value, state)
  960. if self.options_hash then
  961. if self.options_hash[value] then
  962. return value, state
  963. end
  964. else
  965. local _list_0 = self.options
  966. for _index_0 = 1, #_list_0 do
  967. local _continue_0 = false
  968. repeat
  969. local item = _list_0[_index_0]
  970. if item == value then
  971. return value, state
  972. end
  973. if BaseType:is_base_type(item) then
  974. local new_value, new_state = item:_transform(value, state)
  975. if new_value == FailedTransform then
  976. _continue_0 = true
  977. break
  978. end
  979. return new_value, new_state
  980. end
  981. _continue_0 = true
  982. until true
  983. if not _continue_0 then
  984. break
  985. end
  986. end
  987. end
  988. return FailedTransform, "expected " .. tostring(self:_describe())
  989. end
  990. }
  991. _base_0.__index = _base_0
  992. setmetatable(_base_0, _parent_0.__base)
  993. _class_0 = setmetatable({
  994. __init = function(self, options)
  995. self.options = options
  996. assert(type(self.options) == "table", "expected table for options in one_of")
  997. local fast_opts = types.array_of(types.number + types.string)
  998. if fast_opts(self.options) then
  999. do
  1000. local _tbl_0 = { }
  1001. local _list_0 = self.options
  1002. for _index_0 = 1, #_list_0 do
  1003. local v = _list_0[_index_0]
  1004. _tbl_0[v] = true
  1005. end
  1006. self.options_hash = _tbl_0
  1007. end
  1008. end
  1009. end,
  1010. __base = _base_0,
  1011. __name = "OneOf",
  1012. __parent = _parent_0
  1013. }, {
  1014. __index = function(cls, name)
  1015. local val = rawget(_base_0, name)
  1016. if val == nil then
  1017. local parent = rawget(cls, "__parent")
  1018. if parent then
  1019. return parent[name]
  1020. end
  1021. else
  1022. return val
  1023. end
  1024. end,
  1025. __call = function(cls, ...)
  1026. local _self_0 = setmetatable({}, _base_0)
  1027. cls.__init(_self_0, ...)
  1028. return _self_0
  1029. end
  1030. })
  1031. _base_0.__class = _class_0
  1032. if _parent_0.__inherited then
  1033. _parent_0.__inherited(_parent_0, _class_0)
  1034. end
  1035. OneOf = _class_0
  1036. end
  1037. local AllOf
  1038. do
  1039. local _class_0
  1040. local _parent_0 = BaseType
  1041. local _base_0 = {
  1042. _describe = function(self)
  1043. local item_names
  1044. do
  1045. local _accum_0 = { }
  1046. local _len_0 = 1
  1047. local _list_0 = self.types
  1048. for _index_0 = 1, #_list_0 do
  1049. local i = _list_0[_index_0]
  1050. _accum_0[_len_0] = describe_type(i)
  1051. _len_0 = _len_0 + 1
  1052. end
  1053. item_names = _accum_0
  1054. end
  1055. return join_names(item_names, " and ")
  1056. end,
  1057. _transform = function(self, value, state)
  1058. local _list_0 = self.types
  1059. for _index_0 = 1, #_list_0 do
  1060. local t = _list_0[_index_0]
  1061. value, state = t:_transform(value, state)
  1062. if value == FailedTransform then
  1063. return FailedTransform, state
  1064. end
  1065. end
  1066. return value, state
  1067. end
  1068. }
  1069. _base_0.__index = _base_0
  1070. setmetatable(_base_0, _parent_0.__base)
  1071. _class_0 = setmetatable({
  1072. __init = function(self, types)
  1073. self.types = types
  1074. assert(type(self.types) == "table", "expected table for first argument")
  1075. local _list_0 = self.types
  1076. for _index_0 = 1, #_list_0 do
  1077. local checker = _list_0[_index_0]
  1078. assert(BaseType:is_base_type(checker), "all_of expects all type checkers")
  1079. end
  1080. end,
  1081. __base = _base_0,
  1082. __name = "AllOf",
  1083. __parent = _parent_0
  1084. }, {
  1085. __index = function(cls, name)
  1086. local val = rawget(_base_0, name)
  1087. if val == nil then
  1088. local parent = rawget(cls, "__parent")
  1089. if parent then
  1090. return parent[name]
  1091. end
  1092. else
  1093. return val
  1094. end
  1095. end,
  1096. __call = function(cls, ...)
  1097. local _self_0 = setmetatable({}, _base_0)
  1098. cls.__init(_self_0, ...)
  1099. return _self_0
  1100. end
  1101. })
  1102. _base_0.__class = _class_0
  1103. if _parent_0.__inherited then
  1104. _parent_0.__inherited(_parent_0, _class_0)
  1105. end
  1106. AllOf = _class_0
  1107. end
  1108. local ArrayOf
  1109. do
  1110. local _class_0
  1111. local _parent_0 = BaseType
  1112. local _base_0 = {
  1113. _describe = function(self)
  1114. return "array of " .. tostring(describe_type(self.expected))
  1115. end,
  1116. _transform = function(self, value, state)
  1117. local pass, err = types.table(value)
  1118. if not (pass) then
  1119. return FailedTransform, err
  1120. end
  1121. if self.length_type then
  1122. local len = #value
  1123. local res
  1124. res, state = self.length_type:_transform(len, state)
  1125. if res == FailedTransform then
  1126. return FailedTransform, "array length " .. tostring(state) .. ", got " .. tostring(len)
  1127. end
  1128. end
  1129. local is_literal = not BaseType:is_base_type(self.expected)
  1130. local copy, k
  1131. for idx, item in ipairs(value) do
  1132. local skip_item = false
  1133. local transformed_item
  1134. if is_literal then
  1135. if self.expected ~= item then
  1136. return FailedTransform, "array item " .. tostring(idx) .. ": expected " .. tostring(describe_type(self.expected))
  1137. else
  1138. transformed_item = item
  1139. end
  1140. else
  1141. local item_val
  1142. item_val, state = self.expected:_transform(item, state)
  1143. if item_val == FailedTransform then
  1144. return FailedTransform, "array item " .. tostring(idx) .. ": " .. tostring(state)
  1145. end
  1146. if item_val == nil and not self.keep_nils then
  1147. skip_item = true
  1148. else
  1149. transformed_item = item_val
  1150. end
  1151. end
  1152. if transformed_item ~= item or skip_item then
  1153. if not (copy) then
  1154. do
  1155. local _accum_0 = { }
  1156. local _len_0 = 1
  1157. local _max_0 = idx - 1
  1158. for _index_0 = 1, _max_0 < 0 and #value + _max_0 or _max_0 do
  1159. local i = value[_index_0]
  1160. _accum_0[_len_0] = i
  1161. _len_0 = _len_0 + 1
  1162. end
  1163. copy = _accum_0
  1164. end
  1165. k = idx
  1166. end
  1167. end
  1168. if copy and not skip_item then
  1169. copy[k] = transformed_item
  1170. k = k + 1
  1171. end
  1172. end
  1173. return copy or value, state
  1174. end
  1175. }
  1176. _base_0.__index = _base_0
  1177. setmetatable(_base_0, _parent_0.__base)
  1178. _class_0 = setmetatable({
  1179. __init = function(self, expected, opts)
  1180. self.expected = expected
  1181. if opts then
  1182. self.keep_nils = opts.keep_nils and true
  1183. if opts.length then
  1184. self.length_type = assert(coerce_literal(opts.length))
  1185. end
  1186. end
  1187. end,
  1188. __base = _base_0,
  1189. __name = "ArrayOf",
  1190. __parent = _parent_0
  1191. }, {
  1192. __index = function(cls, name)
  1193. local val = rawget(_base_0, name)
  1194. if val == nil then
  1195. local parent = rawget(cls, "__parent")
  1196. if parent then
  1197. return parent[name]
  1198. end
  1199. else
  1200. return val
  1201. end
  1202. end,
  1203. __call = function(cls, ...)
  1204. local _self_0 = setmetatable({}, _base_0)
  1205. cls.__init(_self_0, ...)
  1206. return _self_0
  1207. end
  1208. })
  1209. _base_0.__class = _class_0
  1210. local self = _class_0
  1211. self.type_err_message = "expecting table"
  1212. if _parent_0.__inherited then
  1213. _parent_0.__inherited(_parent_0, _class_0)
  1214. end
  1215. ArrayOf = _class_0
  1216. end
  1217. local ArrayContains
  1218. do
  1219. local _class_0
  1220. local _parent_0 = BaseType
  1221. local _base_0 = {
  1222. short_circuit = true,
  1223. keep_nils = false,
  1224. _describe = function(self)
  1225. return "array containing " .. tostring(describe_type(self.contains))
  1226. end,
  1227. _transform = function(self, value, state)
  1228. local pass, err = types.table(value)
  1229. if not (pass) then
  1230. return FailedTransform, err
  1231. end
  1232. local is_literal = not BaseType:is_base_type(self.contains)
  1233. local contains = false
  1234. local copy, k
  1235. for idx, item in ipairs(value) do
  1236. local skip_item = false
  1237. local transformed_item
  1238. if is_literal then
  1239. if self.contains == item then
  1240. contains = true
  1241. end
  1242. transformed_item = item
  1243. else
  1244. local item_val, new_state = self.contains:_transform(item, state)
  1245. if item_val == FailedTransform then
  1246. transformed_item = item
  1247. else
  1248. state = new_state
  1249. contains = true
  1250. if item_val == nil and not self.keep_nils then
  1251. skip_item = true
  1252. else
  1253. transformed_item = item_val
  1254. end
  1255. end
  1256. end
  1257. if transformed_item ~= item or skip_item then
  1258. if not (copy) then
  1259. do
  1260. local _accum_0 = { }
  1261. local _len_0 = 1
  1262. local _max_0 = idx - 1
  1263. for _index_0 = 1, _max_0 < 0 and #value + _max_0 or _max_0 do
  1264. local i = value[_index_0]
  1265. _accum_0[_len_0] = i
  1266. _len_0 = _len_0 + 1
  1267. end
  1268. copy = _accum_0
  1269. end
  1270. k = idx
  1271. end
  1272. end
  1273. if copy and not skip_item then
  1274. copy[k] = transformed_item
  1275. k = k + 1
  1276. end
  1277. if contains and self.short_circuit then
  1278. if copy then
  1279. for kdx = idx + 1, #value do
  1280. copy[k] = value[kdx]
  1281. k = k + 1
  1282. end
  1283. end
  1284. break
  1285. end
  1286. end
  1287. if not (contains) then
  1288. return FailedTransform, "expected " .. tostring(self:_describe())
  1289. end
  1290. return copy or value, state
  1291. end
  1292. }
  1293. _base_0.__index = _base_0
  1294. setmetatable(_base_0, _parent_0.__base)
  1295. _class_0 = setmetatable({
  1296. __init = function(self, contains, opts)
  1297. self.contains = contains
  1298. assert(self.contains, "missing contains")
  1299. if opts then
  1300. self.short_circuit = opts.short_circuit and true
  1301. self.keep_nils = opts.keep_nils and true
  1302. end
  1303. end,
  1304. __base = _base_0,
  1305. __name = "ArrayContains",
  1306. __parent = _parent_0
  1307. }, {
  1308. __index = function(cls, name)
  1309. local val = rawget(_base_0, name)
  1310. if val == nil then
  1311. local parent = rawget(cls, "__parent")
  1312. if parent then
  1313. return parent[name]
  1314. end
  1315. else
  1316. return val
  1317. end
  1318. end,
  1319. __call = function(cls, ...)
  1320. local _self_0 = setmetatable({}, _base_0)
  1321. cls.__init(_self_0, ...)
  1322. return _self_0
  1323. end
  1324. })
  1325. _base_0.__class = _class_0
  1326. local self = _class_0
  1327. self.type_err_message = "expecting table"
  1328. if _parent_0.__inherited then
  1329. _parent_0.__inherited(_parent_0, _class_0)
  1330. end
  1331. ArrayContains = _class_0
  1332. end
  1333. local MapOf
  1334. do
  1335. local _class_0
  1336. local _parent_0 = BaseType
  1337. local _base_0 = {
  1338. _describe = function(self)
  1339. return "map of " .. tostring(self.expected_key:_describe()) .. " -> " .. tostring(self.expected_value:_describe())
  1340. end,
  1341. _transform = function(self, value, state)
  1342. local pass, err = types.table(value)
  1343. if not (pass) then
  1344. return FailedTransform, err
  1345. end
  1346. local key_literal = not BaseType:is_base_type(self.expected_key)
  1347. local value_literal = not BaseType:is_base_type(self.expected_value)
  1348. local transformed = false
  1349. local out = { }
  1350. for k, v in pairs(value) do
  1351. local _continue_0 = false
  1352. repeat
  1353. local new_k = k
  1354. local new_v = v
  1355. if key_literal then
  1356. if k ~= self.expected_key then
  1357. return FailedTransform, "map key expected " .. tostring(describe_type(self.expected_key))
  1358. end
  1359. else
  1360. new_k, state = self.expected_key:_transform(k, state)
  1361. if new_k == FailedTransform then
  1362. return FailedTransform, "map key " .. tostring(state)
  1363. end
  1364. end
  1365. if value_literal then
  1366. if v ~= self.expected_value then
  1367. return FailedTransform, "map value expected " .. tostring(describe_type(self.expected_value))
  1368. end
  1369. else
  1370. new_v, state = self.expected_value:_transform(v, state)
  1371. if new_v == FailedTransform then
  1372. return FailedTransform, "map value " .. tostring(state)
  1373. end
  1374. end
  1375. if new_k ~= k or new_v ~= v then
  1376. transformed = true
  1377. end
  1378. if new_k == nil then
  1379. _continue_0 = true
  1380. break
  1381. end
  1382. out[new_k] = new_v
  1383. _continue_0 = true
  1384. until true
  1385. if not _continue_0 then
  1386. break
  1387. end
  1388. end
  1389. return transformed and out or value, state
  1390. end
  1391. }
  1392. _base_0.__index = _base_0
  1393. setmetatable(_base_0, _parent_0.__base)
  1394. _class_0 = setmetatable({
  1395. __init = function(self, expected_key, expected_value)
  1396. self.expected_key = coerce_literal(expected_key)
  1397. self.expected_value = coerce_literal(expected_value)
  1398. end,
  1399. __base = _base_0,
  1400. __name = "MapOf",
  1401. __parent = _parent_0
  1402. }, {
  1403. __index = function(cls, name)
  1404. local val = rawget(_base_0, name)
  1405. if val == nil then
  1406. local parent = rawget(cls, "__parent")
  1407. if parent then
  1408. return parent[name]
  1409. end
  1410. else
  1411. return val
  1412. end
  1413. end,
  1414. __call = function(cls, ...)
  1415. local _self_0 = setmetatable({}, _base_0)
  1416. cls.__init(_self_0, ...)
  1417. return _self_0
  1418. end
  1419. })
  1420. _base_0.__class = _class_0
  1421. if _parent_0.__inherited then
  1422. _parent_0.__inherited(_parent_0, _class_0)
  1423. end
  1424. MapOf = _class_0
  1425. end
  1426. local Shape
  1427. do
  1428. local _class_0
  1429. local _parent_0 = BaseType
  1430. local _base_0 = {
  1431. open = false,
  1432. check_all = false,
  1433. is_open = function(self)
  1434. return Shape(self.shape, {
  1435. open = true,
  1436. check_all = self.check_all or nil
  1437. })
  1438. end,
  1439. _describe = function(self)
  1440. local parts
  1441. do
  1442. local _accum_0 = { }
  1443. local _len_0 = 1
  1444. for k, v in pairs(self.shape) do
  1445. _accum_0[_len_0] = tostring(describe_type(k)) .. " = " .. tostring(describe_type(v))
  1446. _len_0 = _len_0 + 1
  1447. end
  1448. parts = _accum_0
  1449. end
  1450. return "{ " .. tostring(table.concat(parts, ", ")) .. " }"
  1451. end,
  1452. _transform = function(self, value, state)
  1453. local pass, err = types.table(value)
  1454. if not (pass) then
  1455. return FailedTransform, err
  1456. end
  1457. local check_all = self.check_all
  1458. local remaining_keys
  1459. do
  1460. local _tbl_0 = { }
  1461. for key in pairs(value) do
  1462. _tbl_0[key] = true
  1463. end
  1464. remaining_keys = _tbl_0
  1465. end
  1466. local errors
  1467. local dirty = false
  1468. local out = { }
  1469. for shape_key, shape_val in pairs(self.shape) do
  1470. local item_value = value[shape_key]
  1471. if remaining_keys then
  1472. remaining_keys[shape_key] = nil
  1473. end
  1474. local new_val
  1475. if BaseType:is_base_type(shape_val) then
  1476. new_val, state = shape_val:_transform(item_value, state)
  1477. else
  1478. if shape_val == item_value then
  1479. new_val, state = item_value, state
  1480. else
  1481. new_val, state = FailedTransform, "expected " .. tostring(describe_type(shape_val))
  1482. end
  1483. end
  1484. if new_val == FailedTransform then
  1485. err = "field " .. tostring(describe_type(shape_key)) .. ": " .. tostring(state)
  1486. if check_all then
  1487. if errors then
  1488. table.insert(errors, err)
  1489. else
  1490. errors = {
  1491. err
  1492. }
  1493. end
  1494. else
  1495. return FailedTransform, err
  1496. end
  1497. else
  1498. if new_val ~= item_value then
  1499. dirty = true
  1500. end
  1501. out[shape_key] = new_val
  1502. end
  1503. end
  1504. if remaining_keys and next(remaining_keys) then
  1505. if self.open then
  1506. for k in pairs(remaining_keys) do
  1507. out[k] = value[k]
  1508. end
  1509. elseif self.extra_fields_type then
  1510. for k in pairs(remaining_keys) do
  1511. local item_value = value[k]
  1512. local tuple
  1513. tuple, state = self.extra_fields_type:_transform({
  1514. [k] = item_value
  1515. }, state)
  1516. if tuple == FailedTransform then
  1517. err = "field " .. tostring(describe_type(k)) .. ": " .. tostring(state)
  1518. if check_all then
  1519. if errors then
  1520. table.insert(errors, err)
  1521. else
  1522. errors = {
  1523. err
  1524. }
  1525. end
  1526. else
  1527. return FailedTransform, err
  1528. end
  1529. else
  1530. do
  1531. local nk = tuple and next(tuple)
  1532. if nk then
  1533. if nk ~= k then
  1534. dirty = true
  1535. elseif tuple[nk] ~= item_value then
  1536. dirty = true
  1537. end
  1538. out[nk] = tuple[nk]
  1539. else
  1540. dirty = true
  1541. end
  1542. end
  1543. end
  1544. end
  1545. else
  1546. local names
  1547. do
  1548. local _accum_0 = { }
  1549. local _len_0 = 1
  1550. for key in pairs(remaining_keys) do
  1551. _accum_0[_len_0] = describe_type(key)
  1552. _len_0 = _len_0 + 1
  1553. end
  1554. names = _accum_0
  1555. end
  1556. err = "extra fields: " .. tostring(table.concat(names, ", "))
  1557. if check_all then
  1558. if errors then
  1559. table.insert(errors, err)
  1560. else
  1561. errors = {
  1562. err
  1563. }
  1564. end
  1565. else
  1566. return FailedTransform, err
  1567. end
  1568. end
  1569. end
  1570. if errors and next(errors) then
  1571. return FailedTransform, table.concat(errors, "; ")
  1572. end
  1573. return dirty and out or value, state
  1574. end
  1575. }
  1576. _base_0.__index = _base_0
  1577. setmetatable(_base_0, _parent_0.__base)
  1578. _class_0 = setmetatable({
  1579. __init = function(self, shape, opts)
  1580. self.shape = shape
  1581. assert(type(self.shape) == "table", "expected table for shape")
  1582. if opts then
  1583. if opts.extra_fields then
  1584. assert(BaseType:is_base_type(opts.extra_fields), "extra_fields_type must be type checker")
  1585. self.extra_fields_type = opts.extra_fields
  1586. end
  1587. self.open = opts.open and true
  1588. self.check_all = opts.check_all and true
  1589. if self.open then
  1590. assert(not self.extra_fields_type, "open can not be combined with extra_fields")
  1591. end
  1592. if self.extra_fields_type then
  1593. return assert(not self.open, "extra_fields can not be combined with open")
  1594. end
  1595. end
  1596. end,
  1597. __base = _base_0,
  1598. __name = "Shape",
  1599. __parent = _parent_0
  1600. }, {
  1601. __index = function(cls, name)
  1602. local val = rawget(_base_0, name)
  1603. if val == nil then
  1604. local parent = rawget(cls, "__parent")
  1605. if parent then
  1606. return parent[name]
  1607. end
  1608. else
  1609. return val
  1610. end
  1611. end,
  1612. __call = function(cls, ...)
  1613. local _self_0 = setmetatable({}, _base_0)
  1614. cls.__init(_self_0, ...)
  1615. return _self_0
  1616. end
  1617. })
  1618. _base_0.__class = _class_0
  1619. local self = _class_0
  1620. self.type_err_message = "expecting table"
  1621. if _parent_0.__inherited then
  1622. _parent_0.__inherited(_parent_0, _class_0)
  1623. end
  1624. Shape = _class_0
  1625. end
  1626. local Partial
  1627. do
  1628. local _class_0
  1629. local _parent_0 = Shape
  1630. local _base_0 = {
  1631. open = true,
  1632. is_open = function(self)
  1633. return error("is_open has no effect on Partial")
  1634. end
  1635. }
  1636. _base_0.__index = _base_0
  1637. setmetatable(_base_0, _parent_0.__base)
  1638. _class_0 = setmetatable({
  1639. __init = function(self, ...)
  1640. return _class_0.__parent.__init(self, ...)
  1641. end,
  1642. __base = _base_0,
  1643. __name = "Partial",
  1644. __parent = _parent_0
  1645. }, {
  1646. __index = function(cls, name)
  1647. local val = rawget(_base_0, name)
  1648. if val == nil then
  1649. local parent = rawget(cls, "__parent")
  1650. if parent then
  1651. return parent[name]
  1652. end
  1653. else
  1654. return val
  1655. end
  1656. end,
  1657. __call = function(cls, ...)
  1658. local _self_0 = setmetatable({}, _base_0)
  1659. cls.__init(_self_0, ...)
  1660. return _self_0
  1661. end
  1662. })
  1663. _base_0.__class = _class_0
  1664. if _parent_0.__inherited then
  1665. _parent_0.__inherited(_parent_0, _class_0)
  1666. end
  1667. Partial = _class_0
  1668. end
  1669. local Pattern
  1670. do
  1671. local _class_0
  1672. local _parent_0 = BaseType
  1673. local _base_0 = {
  1674. _describe = function(self)
  1675. return "pattern " .. tostring(describe_type(self.pattern))
  1676. end,
  1677. _transform = function(self, value, state)
  1678. local test_value
  1679. if self.coerce then
  1680. if BaseType:is_base_type(self.coerce) then
  1681. local c_res, err = self.coerce:_transform(value)
  1682. if c_res == FailedTransform then
  1683. return FailedTransform, err
  1684. end
  1685. test_value = c_res
  1686. else
  1687. test_value = tostring(value)
  1688. end
  1689. else
  1690. test_value = value
  1691. end
  1692. local t_res, err = types.string(test_value)
  1693. if not (t_res) then
  1694. return FailedTransform, err
  1695. end
  1696. if test_value:match(self.pattern) then
  1697. return value, state
  1698. else
  1699. return FailedTransform, "doesn't match " .. tostring(self:_describe())
  1700. end
  1701. end
  1702. }
  1703. _base_0.__index = _base_0
  1704. setmetatable(_base_0, _parent_0.__base)
  1705. _class_0 = setmetatable({
  1706. __init = function(self, pattern, opts)
  1707. self.pattern = pattern
  1708. assert(type(self.pattern) == "string", "Pattern must be a string")
  1709. if opts then
  1710. self.coerce = opts.coerce
  1711. return assert(opts.initial_type == nil, "initial_type has been removed from types.pattern (got: " .. tostring(opts.initial_type) .. ")")
  1712. end
  1713. end,
  1714. __base = _base_0,
  1715. __name = "Pattern",
  1716. __parent = _parent_0
  1717. }, {
  1718. __index = function(cls, name)
  1719. local val = rawget(_base_0, name)
  1720. if val == nil then
  1721. local parent = rawget(cls, "__parent")
  1722. if parent then
  1723. return parent[name]
  1724. end
  1725. else
  1726. return val
  1727. end
  1728. end,
  1729. __call = function(cls, ...)
  1730. local _self_0 = setmetatable({}, _base_0)
  1731. cls.__init(_self_0, ...)
  1732. return _self_0
  1733. end
  1734. })
  1735. _base_0.__class = _class_0
  1736. if _parent_0.__inherited then
  1737. _parent_0.__inherited(_parent_0, _class_0)
  1738. end
  1739. Pattern = _class_0
  1740. end
  1741. do
  1742. local _class_0
  1743. local _parent_0 = BaseType
  1744. local _base_0 = {
  1745. _describe = function(self)
  1746. return describe_type(self.value)
  1747. end,
  1748. _transform = function(self, value, state)
  1749. if self.value ~= value then
  1750. return FailedTransform, "expected " .. tostring(self:_describe())
  1751. end
  1752. return value, state
  1753. end
  1754. }
  1755. _base_0.__index = _base_0
  1756. setmetatable(_base_0, _parent_0.__base)
  1757. _class_0 = setmetatable({
  1758. __init = function(self, value)
  1759. self.value = value
  1760. end,
  1761. __base = _base_0,
  1762. __name = "Literal",
  1763. __parent = _parent_0
  1764. }, {
  1765. __index = function(cls, name)
  1766. local val = rawget(_base_0, name)
  1767. if val == nil then
  1768. local parent = rawget(cls, "__parent")
  1769. if parent then
  1770. return parent[name]
  1771. end
  1772. else
  1773. return val
  1774. end
  1775. end,
  1776. __call = function(cls, ...)
  1777. local _self_0 = setmetatable({}, _base_0)
  1778. cls.__init(_self_0, ...)
  1779. return _self_0
  1780. end
  1781. })
  1782. _base_0.__class = _class_0
  1783. if _parent_0.__inherited then
  1784. _parent_0.__inherited(_parent_0, _class_0)
  1785. end
  1786. Literal = _class_0
  1787. end
  1788. local Custom
  1789. do
  1790. local _class_0
  1791. local _parent_0 = BaseType
  1792. local _base_0 = {
  1793. _describe = function(self)
  1794. return "custom checker " .. tostring(self.fn)
  1795. end,
  1796. _transform = function(self, value, state)
  1797. local pass, err = self.fn(value, state)
  1798. if not (pass) then
  1799. return FailedTransform, err or "failed custom check"
  1800. end
  1801. return value, state
  1802. end
  1803. }
  1804. _base_0.__index = _base_0
  1805. setmetatable(_base_0, _parent_0.__base)
  1806. _class_0 = setmetatable({
  1807. __init = function(self, fn)
  1808. self.fn = fn
  1809. return assert(type(self.fn) == "function", "custom checker must be a function")
  1810. end,
  1811. __base = _base_0,
  1812. __name = "Custom",
  1813. __parent = _parent_0
  1814. }, {
  1815. __index = function(cls, name)
  1816. local val = rawget(_base_0, name)
  1817. if val == nil then
  1818. local parent = rawget(cls, "__parent")
  1819. if parent then
  1820. return parent[name]
  1821. end
  1822. else
  1823. return val
  1824. end
  1825. end,
  1826. __call = function(cls, ...)
  1827. local _self_0 = setmetatable({}, _base_0)
  1828. cls.__init(_self_0, ...)
  1829. return _self_0
  1830. end
  1831. })
  1832. _base_0.__class = _class_0
  1833. if _parent_0.__inherited then
  1834. _parent_0.__inherited(_parent_0, _class_0)
  1835. end
  1836. Custom = _class_0
  1837. end
  1838. local Equivalent
  1839. do
  1840. local _class_0
  1841. local values_equivalent
  1842. local _parent_0 = BaseType
  1843. local _base_0 = {
  1844. _describe = function(self)
  1845. return "equivalent to " .. tostring(describe_type(self.val))
  1846. end,
  1847. _transform = function(self, value, state)
  1848. if values_equivalent(self.val, value) then
  1849. return value, state
  1850. else
  1851. return FailedTransform, "not equivalent to " .. tostring(self.val)
  1852. end
  1853. end
  1854. }
  1855. _base_0.__index = _base_0
  1856. setmetatable(_base_0, _parent_0.__base)
  1857. _class_0 = setmetatable({
  1858. __init = function(self, val)
  1859. self.val = val
  1860. end,
  1861. __base = _base_0,
  1862. __name = "Equivalent",
  1863. __parent = _parent_0
  1864. }, {
  1865. __index = function(cls, name)
  1866. local val = rawget(_base_0, name)
  1867. if val == nil then
  1868. local parent = rawget(cls, "__parent")
  1869. if parent then
  1870. return parent[name]
  1871. end
  1872. else
  1873. return val
  1874. end
  1875. end,
  1876. __call = function(cls, ...)
  1877. local _self_0 = setmetatable({}, _base_0)
  1878. cls.__init(_self_0, ...)
  1879. return _self_0
  1880. end
  1881. })
  1882. _base_0.__class = _class_0
  1883. local self = _class_0
  1884. values_equivalent = function(a, b)
  1885. if a == b then
  1886. return true
  1887. end
  1888. if type(a) == "table" and type(b) == "table" then
  1889. local seen_keys = { }
  1890. for k, v in pairs(a) do
  1891. seen_keys[k] = true
  1892. if not (values_equivalent(v, b[k])) then
  1893. return false
  1894. end
  1895. end
  1896. for k, v in pairs(b) do
  1897. local _continue_0 = false
  1898. repeat
  1899. if seen_keys[k] then
  1900. _continue_0 = true
  1901. break
  1902. end
  1903. if not (values_equivalent(v, a[k])) then
  1904. return false
  1905. end
  1906. _continue_0 = true
  1907. until true
  1908. if not _continue_0 then
  1909. break
  1910. end
  1911. end
  1912. return true
  1913. else
  1914. return false
  1915. end
  1916. end
  1917. if _parent_0.__inherited then
  1918. _parent_0.__inherited(_parent_0, _class_0)
  1919. end
  1920. Equivalent = _class_0
  1921. end
  1922. local Range
  1923. do
  1924. local _class_0
  1925. local _parent_0 = BaseType
  1926. local _base_0 = {
  1927. _transform = function(self, value, state)
  1928. local res
  1929. res, state = self.value_type:_transform(value, state)
  1930. if res == FailedTransform then
  1931. return FailedTransform, "range " .. tostring(state)
  1932. end
  1933. if value < self.left then
  1934. return FailedTransform, "not in " .. tostring(self:_describe())
  1935. end
  1936. if value > self.right then
  1937. return FailedTransform, "not in " .. tostring(self:_describe())
  1938. end
  1939. return value, state
  1940. end,
  1941. _describe = function(self)
  1942. return "range from " .. tostring(self.left) .. " to " .. tostring(self.right)
  1943. end
  1944. }
  1945. _base_0.__index = _base_0
  1946. setmetatable(_base_0, _parent_0.__base)
  1947. _class_0 = setmetatable({
  1948. __init = function(self, left, right)
  1949. self.left, self.right = left, right
  1950. assert(self.left <= self.right, "left range value should be less than right range value")
  1951. self.value_type = assert(types[type(self.left)], "couldn't figure out type of range boundary")
  1952. end,
  1953. __base = _base_0,
  1954. __name = "Range",
  1955. __parent = _parent_0
  1956. }, {
  1957. __index = function(cls, name)
  1958. local val = rawget(_base_0, name)
  1959. if val == nil then
  1960. local parent = rawget(cls, "__parent")
  1961. if parent then
  1962. return parent[name]
  1963. end
  1964. else
  1965. return val
  1966. end
  1967. end,
  1968. __call = function(cls, ...)
  1969. local _self_0 = setmetatable({}, _base_0)
  1970. cls.__init(_self_0, ...)
  1971. return _self_0
  1972. end
  1973. })
  1974. _base_0.__class = _class_0
  1975. if _parent_0.__inherited then
  1976. _parent_0.__inherited(_parent_0, _class_0)
  1977. end
  1978. Range = _class_0
  1979. end
  1980. local Proxy
  1981. do
  1982. local _class_0
  1983. local _parent_0 = BaseType
  1984. local _base_0 = {
  1985. _transform = function(self, ...)
  1986. return assert(self.fn(), "proxy missing transformer"):_transform(...)
  1987. end,
  1988. _describe = function(self, ...)
  1989. return assert(self.fn(), "proxy missing transformer"):_describe(...)
  1990. end
  1991. }
  1992. _base_0.__index = _base_0
  1993. setmetatable(_base_0, _parent_0.__base)
  1994. _class_0 = setmetatable({
  1995. __init = function(self, fn)
  1996. self.fn = fn
  1997. end,
  1998. __base = _base_0,
  1999. __name = "Proxy",
  2000. __parent = _parent_0
  2001. }, {
  2002. __index = function(cls, name)
  2003. local val = rawget(_base_0, name)
  2004. if val == nil then
  2005. local parent = rawget(cls, "__parent")
  2006. if parent then
  2007. return parent[name]
  2008. end
  2009. else
  2010. return val
  2011. end
  2012. end,
  2013. __call = function(cls, ...)
  2014. local _self_0 = setmetatable({}, _base_0)
  2015. cls.__init(_self_0, ...)
  2016. return _self_0
  2017. end
  2018. })
  2019. _base_0.__class = _class_0
  2020. if _parent_0.__inherited then
  2021. _parent_0.__inherited(_parent_0, _class_0)
  2022. end
  2023. Proxy = _class_0
  2024. end
  2025. local AssertType
  2026. do
  2027. local _class_0
  2028. local _parent_0 = BaseType
  2029. local _base_0 = {
  2030. assert = assert,
  2031. _transform = function(self, value, state)
  2032. local state_or_err
  2033. value, state_or_err = self.base_type:_transform(value, state)
  2034. self.assert(value ~= FailedTransform, state_or_err)
  2035. return value, state_or_err
  2036. end,
  2037. _describe = function(self)
  2038. if self.base_type._describe then
  2039. local base_description = self.base_type:_describe()
  2040. return "assert " .. tostring(base_description)
  2041. end
  2042. end
  2043. }
  2044. _base_0.__index = _base_0
  2045. setmetatable(_base_0, _parent_0.__base)
  2046. _class_0 = setmetatable({
  2047. __init = function(self, base_type)
  2048. self.base_type = base_type
  2049. return assert(BaseType:is_base_type(self.base_type), "expected a type checker")
  2050. end,
  2051. __base = _base_0,
  2052. __name = "AssertType",
  2053. __parent = _parent_0
  2054. }, {
  2055. __index = function(cls, name)
  2056. local val = rawget(_base_0, name)
  2057. if val == nil then
  2058. local parent = rawget(cls, "__parent")
  2059. if parent then
  2060. return parent[name]
  2061. end
  2062. else
  2063. return val
  2064. end
  2065. end,
  2066. __call = function(cls, ...)
  2067. local _self_0 = setmetatable({}, _base_0)
  2068. cls.__init(_self_0, ...)
  2069. return _self_0
  2070. end
  2071. })
  2072. _base_0.__class = _class_0
  2073. if _parent_0.__inherited then
  2074. _parent_0.__inherited(_parent_0, _class_0)
  2075. end
  2076. AssertType = _class_0
  2077. end
  2078. do
  2079. local _class_0
  2080. local _parent_0 = BaseType
  2081. local _base_0 = {
  2082. _transform = function(self, value, state)
  2083. local out, _ = self.base_type:_transform(value, state)
  2084. if out == FailedTransform then
  2085. return value, state
  2086. else
  2087. return FailedTransform, "expected " .. tostring(self:_describe())
  2088. end
  2089. end,
  2090. _describe = function(self)
  2091. if self.base_type._describe then
  2092. local base_description = self.base_type:_describe()
  2093. return "not " .. tostring(base_description)
  2094. end
  2095. end
  2096. }
  2097. _base_0.__index = _base_0
  2098. setmetatable(_base_0, _parent_0.__base)
  2099. _class_0 = setmetatable({
  2100. __init = function(self, base_type)
  2101. self.base_type = base_type
  2102. return assert(BaseType:is_base_type(self.base_type), "expected a type checker")
  2103. end,
  2104. __base = _base_0,
  2105. __name = "NotType",
  2106. __parent = _parent_0
  2107. }, {
  2108. __index = function(cls, name)
  2109. local val = rawget(_base_0, name)
  2110. if val == nil then
  2111. local parent = rawget(cls, "__parent")
  2112. if parent then
  2113. return parent[name]
  2114. end
  2115. else
  2116. return val
  2117. end
  2118. end,
  2119. __call = function(cls, ...)
  2120. local _self_0 = setmetatable({}, _base_0)
  2121. cls.__init(_self_0, ...)
  2122. return _self_0
  2123. end
  2124. })
  2125. _base_0.__class = _class_0
  2126. if _parent_0.__inherited then
  2127. _parent_0.__inherited(_parent_0, _class_0)
  2128. end
  2129. NotType = _class_0
  2130. end
  2131. local CloneType
  2132. do
  2133. local _class_0
  2134. local _parent_0 = BaseType
  2135. local _base_0 = {
  2136. _transform = function(self, value, state)
  2137. local _exp_0 = type(value)
  2138. if "nil" == _exp_0 or "string" == _exp_0 or "number" == _exp_0 or "boolean" == _exp_0 then
  2139. return value, state
  2140. elseif "table" == _exp_0 then
  2141. local clone_value
  2142. do
  2143. local _tbl_0 = { }
  2144. for k, v in pairs(value) do
  2145. _tbl_0[k] = v
  2146. end
  2147. clone_value = _tbl_0
  2148. end
  2149. do
  2150. local mt = getmetatable(value)
  2151. if mt then
  2152. setmetatable(clone_value, mt)
  2153. end
  2154. end
  2155. return clone_value, state
  2156. else
  2157. return FailedTransform, tostring(describe_type(value)) .. " is not cloneable"
  2158. end
  2159. end,
  2160. _describe = function(self)
  2161. return "cloneable value"
  2162. end
  2163. }
  2164. _base_0.__index = _base_0
  2165. setmetatable(_base_0, _parent_0.__base)
  2166. _class_0 = setmetatable({
  2167. __init = function(self, ...)
  2168. return _class_0.__parent.__init(self, ...)
  2169. end,
  2170. __base = _base_0,
  2171. __name = "CloneType",
  2172. __parent = _parent_0
  2173. }, {
  2174. __index = function(cls, name)
  2175. local val = rawget(_base_0, name)
  2176. if val == nil then
  2177. local parent = rawget(cls, "__parent")
  2178. if parent then
  2179. return parent[name]
  2180. end
  2181. else
  2182. return val
  2183. end
  2184. end,
  2185. __call = function(cls, ...)
  2186. local _self_0 = setmetatable({}, _base_0)
  2187. cls.__init(_self_0, ...)
  2188. return _self_0
  2189. end
  2190. })
  2191. _base_0.__class = _class_0
  2192. if _parent_0.__inherited then
  2193. _parent_0.__inherited(_parent_0, _class_0)
  2194. end
  2195. CloneType = _class_0
  2196. end
  2197. local MetatableIsType
  2198. do
  2199. local _class_0
  2200. local _parent_0 = BaseType
  2201. local _base_0 = {
  2202. allow_metatable_update = false,
  2203. _transform = function(self, value, state)
  2204. local state_or_err
  2205. value, state_or_err = types.table:_transform(value, state)
  2206. if value == FailedTransform then
  2207. return FailedTransform, state_or_err
  2208. end
  2209. local mt = getmetatable(value)
  2210. local new_mt
  2211. new_mt, state_or_err = self.metatable_type:_transform(mt, state_or_err)
  2212. if new_mt == FailedTransform then
  2213. return FailedTransform, "metatable expected: " .. tostring(state_or_err)
  2214. end
  2215. if new_mt ~= mt then
  2216. if self.allow_metatable_update then
  2217. setmetatable(value, new_mt)
  2218. else
  2219. return FailedTransform, "metatable was modified by a type but { allow_metatable_update = true } is not enabled"
  2220. end
  2221. end
  2222. return value, state_or_err
  2223. end,
  2224. _describe = function(self)
  2225. return "has metatable " .. tostring(describe_type(self.metatable_type))
  2226. end
  2227. }
  2228. _base_0.__index = _base_0
  2229. setmetatable(_base_0, _parent_0.__base)
  2230. _class_0 = setmetatable({
  2231. __init = function(self, metatable_type, opts)
  2232. if BaseType:is_base_type(metatable_type) then
  2233. self.metatable_type = metatable_type
  2234. else
  2235. self.metatable_type = Literal(metatable_type)
  2236. end
  2237. if opts then
  2238. self.allow_metatable_update = opts.allow_metatable_update and true
  2239. end
  2240. end,
  2241. __base = _base_0,
  2242. __name = "MetatableIsType",
  2243. __parent = _parent_0
  2244. }, {
  2245. __index = function(cls, name)
  2246. local val = rawget(_base_0, name)
  2247. if val == nil then
  2248. local parent = rawget(cls, "__parent")
  2249. if parent then
  2250. return parent[name]
  2251. end
  2252. else
  2253. return val
  2254. end
  2255. end,
  2256. __call = function(cls, ...)
  2257. local _self_0 = setmetatable({}, _base_0)
  2258. cls.__init(_self_0, ...)
  2259. return _self_0
  2260. end
  2261. })
  2262. _base_0.__class = _class_0
  2263. if _parent_0.__inherited then
  2264. _parent_0.__inherited(_parent_0, _class_0)
  2265. end
  2266. MetatableIsType = _class_0
  2267. end
  2268. local type_nil = Type("nil")
  2269. local type_function = Type("function")
  2270. local type_number = Type("number")
  2271. types = setmetatable({
  2272. any = AnyType(),
  2273. string = Type("string"),
  2274. number = type_number,
  2275. ["function"] = type_function,
  2276. func = type_function,
  2277. boolean = Type("boolean"),
  2278. userdata = Type("userdata"),
  2279. ["nil"] = type_nil,
  2280. null = type_nil,
  2281. table = Type("table"),
  2282. array = ArrayType(),
  2283. clone = CloneType(),
  2284. integer = Pattern("^%d+$", {
  2285. coerce = type_number / tostring
  2286. }),
  2287. one_of = OneOf,
  2288. all_of = AllOf,
  2289. shape = Shape,
  2290. partial = Partial,
  2291. pattern = Pattern,
  2292. array_of = ArrayOf,
  2293. array_contains = ArrayContains,
  2294. map_of = MapOf,
  2295. literal = Literal,
  2296. range = Range,
  2297. equivalent = Equivalent,
  2298. custom = Custom,
  2299. scope = TagScopeType,
  2300. proxy = Proxy,
  2301. assert = AssertType,
  2302. annotate = AnnotateNode,
  2303. metatable_is = MetatableIsType
  2304. }, {
  2305. __index = function(self, fn_name)
  2306. return error("Type checker does not exist: `" .. tostring(fn_name) .. "`")
  2307. end
  2308. })
  2309. local check_shape
  2310. check_shape = function(value, shape)
  2311. assert(shape.check_value, "missing check_value method from shape")
  2312. return shape:check_value(value)
  2313. end
  2314. is_type = function(val)
  2315. return BaseType:is_base_type(val)
  2316. end
  2317. return {
  2318. check_shape = check_shape,
  2319. types = types,
  2320. is_type = is_type,
  2321. BaseType = BaseType,
  2322. FailedTransform = FailedTransform,
  2323. VERSION = "2.6.0"
  2324. }