-- Compiled with @isentinel/roblox-ts v4.0.11 local TS = _G[script] local Boba = TS.import(script, TS.getModule(script, "@rbxts", "boba").src).Boba local Log = TS.import(script, TS.getModule(script, "@rbxts", "log").out).default local fromEntries = TS.import(script, TS.getModule(script, "@rbxts", "object-utils")).fromEntries -- oxfmt-ignore --[[ * * Recursive type-level mapping from a Luau data shape to the Serio-based validation metadata format * consumed by {@link createDataStoreValidator}. * * @typeParam T - The Luau type to encode as validation metadata. ]] --* Discriminated union of all possible validation schema nodes produced by {@link ValidateMetadata}. local function wrapBobaValidator(b) return function(x) return b:assert(x) end end -- eslint-disable jsdoc/require-param-description -- Flamework macro --[[ * * Creates a `Boba` const v function for a specific type. * * @param meta * @metadata macro ]] local function createDataStoreValidator(raw, meta) local schema = meta local validator = nil local _exp = schema[1] repeat if _exp == "bool" then local v = Boba.Boolean validator = if raw then v else wrapBobaValidator(v) break end if _exp == "list" then local _ = schema[1] local elementSchema = schema[2] local v = Boba.Array(createDataStoreValidator(true, elementSchema)) validator = if raw then v else wrapBobaValidator(v) break end if _exp == "literal" then local _ = schema[1] local literals = schema[2] local v = nil for _1, value in literals do v = (if v ~= nil then v:Or(Boba.Literal(value)) else Boba.Literal(value)) end validator = if raw then v else wrapBobaValidator(v) break end if _exp == "map" then local _ = schema[1] local keySchema = schema[2] local valueSchema = schema[3] local v = Boba.Map(createDataStoreValidator(true, keySchema), createDataStoreValidator(true, valueSchema)) validator = if raw then v else wrapBobaValidator(v) break end if _exp == "number" then local v = Boba.Number validator = if raw then v else wrapBobaValidator(v) break end if _exp == "object" then local _ = schema[1] local fields = schema[2] -- ▼ ReadonlyArray.map ▼ local _newValue = table.create(#fields) local _callback = function(_param) local fieldName = _param[1] local fieldSchema = _param[2] return { fieldName, createDataStoreValidator(true, fieldSchema) } end for _k, _v in fields do _newValue[_k] = _callback(_v, _k - 1, fields) end -- ▲ ReadonlyArray.map ▲ local v = Boba.Struct(fromEntries(_newValue)) validator = if raw then v else wrapBobaValidator(v) break end if _exp == "optional" then local _ = schema[1] local valueSchema = schema[2] local v = createDataStoreValidator(true, valueSchema):Optional() validator = if raw then v else wrapBobaValidator(v) break end if _exp == "set" then local _ = schema[1] local valueSchema = schema[2] local v = Boba.Set(createDataStoreValidator(true, valueSchema)) validator = if raw then v else wrapBobaValidator(v) break end if _exp == "string" then local v = Boba.String validator = if raw then v else wrapBobaValidator(v) break end if _exp == "tuple" then local _ = schema[1] local elements = schema[2] local index = 0 -- ▼ ReadonlyArray.map ▼ local _newValue = table.create(#elements) local _callback = function(_param) local tupleSchema = _param[2] index += 1 return { index, createDataStoreValidator(true, tupleSchema) } end for _k, _v in elements do _newValue[_k] = _callback(_v, _k - 1, elements) end -- ▲ ReadonlyArray.map ▲ local v = Boba.ExhaustiveStruct(fromEntries(_newValue)) validator = if raw then v else wrapBobaValidator(v) break end if _exp == "union" then local _ = schema[1] local elements = schema[2] local v = nil for _1, valueSchema in elements do local value = createDataStoreValidator(true, valueSchema) v = (if v ~= nil then v:Or(value) else value) end validator = if raw then v else wrapBobaValidator(v) break end do Log.Fatal(`[validateDataStoreSchema]: Cannot serialize unknown schema type '{schema[1]}'`) end until true return validator end return { createDataStoreValidator = createDataStoreValidator, }