| 929 | } |
| 930 | |
| 931 | function parseToken(state: ParserState): BareItem { |
| 932 | const first = peek(state); |
| 933 | if (!isAlpha(first) && first !== "*") { |
| 934 | throw new SyntaxError( |
| 935 | `Invalid structured field: invalid token start at position ${state.pos}`, |
| 936 | ); |
| 937 | } |
| 938 | |
| 939 | const startPos = state.pos; |
| 940 | state.pos++; // Skip validated first char |
| 941 | while (!isEof(state)) { |
| 942 | const c = peek(state); |
| 943 | if (isTchar(c) || c === ":" || c === "/") { |
| 944 | state.pos++; |
| 945 | } else { |
| 946 | break; |
| 947 | } |
| 948 | } |
| 949 | |
| 950 | return { type: "token", value: state.input.slice(startPos, state.pos) }; |
| 951 | } |
| 952 | |
| 953 | function parseBinary(state: ParserState): BareItem { |
| 954 | if (consume(state) !== ":") { |