import type { ErrorMessage, Scanner, writeUnclosedGroupMessage } from "@ark/util"; import type { State, s } from "./state.ts"; type LookaroundChar = "=" | "!"; export type ModifiableFlag = "i" | "m" | "s"; export type parseGroup = unscanned extends Scanner.shift ? lookahead extends "?" ? parseNonCapturingGroup : s.pushGroup : s.error>; type parseNonCapturingGroup = unscanned extends Scanner.shift ? lookahead extends ":" ? s.pushGroup : lookahead extends LookaroundChar ? s.pushGroup : lookahead extends "<" ? parseNamedGroupOrLookbehind : shiftModifiers extends (ShiftedModifiers) ? following extends ErrorMessage ? s.error : s.pushGroup : never : s.error>; type ShiftedModifiers = [ParsedModifiers, unscanned]; type ParsedModifiers = { flags: flags; negated: negated; }; type shiftModifiers = Scanner.shiftUntil extends (Scanner.shiftResult) ? next extends Scanner.shift ? terminator extends ":" ? parseModifiers extends (ParsedModifiers) ? ShiftedModifiers : ShiftedModifiers & string>> : ShiftedModifiers> : ShiftedModifiers>> : never; type parseModifiers = _parseModifiers; type _parseModifiers = unscanned extends Scanner.shift ? lookahead extends "-" ? [ negated ] extends [never] ? next extends Scanner.shift ? modifier extends ModifiableFlag ? modifier extends flags | negated ? writeDuplicateModifierMessage : _parseModifiers : writeInvalidModifierMessage : missingNegatedModifierMessage : multipleModifierDashesMessage : lookahead extends ModifiableFlag ? lookahead extends flags | negated ? writeDuplicateModifierMessage : [ negated ] extends [never] ? _parseModifiers : _parseModifiers : writeInvalidModifierMessage : ParsedModifiers; export declare const writeDuplicateModifierMessage: (modifier: modifier) => writeDuplicateModifierMessage; type writeDuplicateModifierMessage = `Modifier ${modifier} cannot appear multiple times in a single group`; export declare const multipleModifierDashesMessage = "Modifiers can include at most one '-' to negate subsequent flags"; type multipleModifierDashesMessage = typeof multipleModifierDashesMessage; export declare const missingNegatedModifierMessage = "- must be followed by the modifier flag to negate ('i', 'm' or 's')"; type missingNegatedModifierMessage = typeof missingNegatedModifierMessage; export declare const writeInvalidModifierMessage: (char: char) => writeInvalidModifierMessage; type writeInvalidModifierMessage = `Modifier flag ${char} must be 'i', 'm' or 's'`; type parseNamedGroupOrLookbehind = unscanned extends Scanner.shift ? s.pushGroup : shiftNamedGroup extends (Scanner.shiftResult) ? s.pushGroup : s.error>; type shiftNamedGroup = unscanned extends `${infer name}>${infer next}` ? name extends "" ? Scanner.shiftResult<"", ErrorMessage> : Scanner.shiftResult : Scanner.shiftResult<"", ErrorMessage">>>; export declare const unnamedCaptureGroupMessage = "Capture group <> requires a name"; export type unnamedCaptureGroupMessage = typeof unnamedCaptureGroupMessage; export declare const unescapedLiteralQuestionMarkMessage = "literal ? must be escaped at the start of a group"; export type unescapedLiteralQuestionMarkMessage = typeof unescapedLiteralQuestionMarkMessage; export {};