{"version":3,"file":"utility.luau","names":[],"sources":["..\\..\\src\\centurion\\utility.ts"],"sourcesContent":["import { is } from \"@lisachandra/core/utils/type\";\nimport {\n\ttype ListArgumentType,\n\tListTypeBuilder,\n\ttype SingleArgumentType,\n\tTransformResult,\n\tTypeBuilder,\n} from \"@rbxts/centurion\";\n\n/**\n * Creates a {@link ListArgumentType} from a single-value argument type, enabling comma-separated\n * lists of that type in Centurion commands.\n *\n * @example\n * \t```ts\n * \tconst PlayersList = makeListableType(\"players\", CenturionType.Player);\n * \t```;\n *\n * @param name - The name for the generated list type.\n * @param userType - The base single-argument type to wrap as a list.\n * @returns A registered list argument type that transforms and suggests\n * multiple values at once.\n */\nexport function makeListableType<T extends defined>(\n\tname: string,\n\tuserType: SingleArgumentType<T>,\n): ListArgumentType<Array<T>> {\n\treturn ListTypeBuilder.create<Array<T>>(name)\n\t\t.transform((input, executor) => {\n\t\t\tconst transformed: Array<T> = [];\n\n\t\t\tfor (const text of input) {\n\t\t\t\tconst result = userType.transform(text, executor);\n\t\t\t\tif (!result.ok) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\ttransformed.push(result.value);\n\t\t\t}\n\n\t\t\treturn TransformResult.ok(transformed);\n\t\t})\n\t\t.suggestions((input, executor) => {\n\t\t\tif (!userType.suggestions) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tlet suggestions: Array<string> = [];\n\t\t\tfor (const text of input) {\n\t\t\t\tfor (const suggestion of userType.suggestions(text, executor)) {\n\t\t\t\t\tsuggestions.push(suggestion);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsuggestions = suggestions.filter(\n\t\t\t\t(value, index) => suggestions.indexOf(value) !== index,\n\t\t\t);\n\t\t\treturn suggestions;\n\t\t})\n\t\t.markForRegistration()\n\t\t.build();\n}\n\n/**\n * Creates a Centurion {@link SingleArgumentType} that accepts only the provided string enum values.\n *\n * @example\n * \t```ts\n * \tconst TeamType = makeEnumType(\"team\", [\"Red\", \"Blue\", \"Green\"]);\n * \t```;\n *\n * @param name - The name for the generated type.\n * @param enums - The allowed string values.\n * @returns A registered single-argument type with enum validation.\n */\nexport function makeEnumType<T extends string>(\n\tname: string,\n\tenums: Array<T>,\n): SingleArgumentType<T> {\n\tconst enumSet = new Set<T>(enums);\n\treturn TypeBuilder.create<T>(name)\n\t\t.transform((text) => {\n\t\t\treturn is<T>(text) && enumSet.has(text)\n\t\t\t\t? TransformResult.ok(text)\n\t\t\t\t: TransformResult.err(`Invalid ${name}: ${text}`);\n\t\t})\n\t\t.suggestions(() => enums)\n\t\t.markForRegistration()\n\t\t.build();\n}\n"],"mappings":";;AAAA;AACA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;AAsBA;AAIC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCD;;;;;;;;;;;;;;;AAcA;AAIC;AAAA;;AAAiC;AAAjC;AACA;;;;;;;;;;AASD","ignoreList":[]}