54 lines
2.1 KiB
Plaintext
54 lines
2.1 KiB
Plaintext
import { IsTemplateLiteralExpressionFinite } from './finite.mjs';
|
|
import { TemplateLiteralParseExact } from './parse.mjs';
|
|
import { TypeBoxError } from '../error/index.mjs';
|
|
// ------------------------------------------------------------------
|
|
// TemplateLiteralGenerateError
|
|
// ------------------------------------------------------------------
|
|
export class TemplateLiteralGenerateError extends TypeBoxError {
|
|
}
|
|
// ------------------------------------------------------------------
|
|
// TemplateLiteralExpressionGenerate
|
|
// ------------------------------------------------------------------
|
|
// prettier-ignore
|
|
function* GenerateReduce(buffer) {
|
|
if (buffer.length === 1)
|
|
return yield* buffer[0];
|
|
for (const left of buffer[0]) {
|
|
for (const right of GenerateReduce(buffer.slice(1))) {
|
|
yield `${left}${right}`;
|
|
}
|
|
}
|
|
}
|
|
// prettier-ignore
|
|
function* GenerateAnd(expression) {
|
|
return yield* GenerateReduce(expression.expr.map((expr) => [...TemplateLiteralExpressionGenerate(expr)]));
|
|
}
|
|
// prettier-ignore
|
|
function* GenerateOr(expression) {
|
|
for (const expr of expression.expr)
|
|
yield* TemplateLiteralExpressionGenerate(expr);
|
|
}
|
|
// prettier-ignore
|
|
function* GenerateConst(expression) {
|
|
return yield expression.const;
|
|
}
|
|
export function* TemplateLiteralExpressionGenerate(expression) {
|
|
return expression.type === 'and'
|
|
? yield* GenerateAnd(expression)
|
|
: expression.type === 'or'
|
|
? yield* GenerateOr(expression)
|
|
: expression.type === 'const'
|
|
? yield* GenerateConst(expression)
|
|
: (() => {
|
|
throw new TemplateLiteralGenerateError('Unknown expression');
|
|
})();
|
|
}
|
|
/** Generates a tuple of strings from the given TemplateLiteral. Returns an empty tuple if infinite. */
|
|
export function TemplateLiteralGenerate(schema) {
|
|
const expression = TemplateLiteralParseExact(schema.pattern);
|
|
// prettier-ignore
|
|
return (IsTemplateLiteralExpressionFinite(expression)
|
|
? [...TemplateLiteralExpressionGenerate(expression)]
|
|
: []);
|
|
}
|