(triggerExpression: string, sourceToBindTo: ArbitraryObject | undefined)
| 22 | } |
| 23 | |
| 24 | export function parse(triggerExpression: string, sourceToBindTo: ArbitraryObject | undefined): [boolean, boolean, Map<string, Filter | true>, ArbitraryObject?] { |
| 25 | // |
| 26 | // [modifiers] event[filter]:discriminator[filter]/discriminator[filter]/discriminator[filter]... |
| 27 | // |
| 28 | |
| 29 | const scanner = new Scanner(triggerExpression).start(); |
| 30 | let token: Token; |
| 31 | |
| 32 | let once: boolean = false; |
| 33 | let source: any; |
| 34 | let isSync = false; |
| 35 | |
| 36 | // drop any leading whitespace |
| 37 | scanner.takeWhiteSpaceAndNewLines(); |
| 38 | |
| 39 | // grab modifiers off the front |
| 40 | while (isKeyword(token = scanner.take())) { |
| 41 | switch (token.kind) { |
| 42 | case Kind.OnceKeyword: |
| 43 | once = true; |
| 44 | break; |
| 45 | case Kind.ThisKeyword: |
| 46 | source = sourceToBindTo; |
| 47 | break; |
| 48 | case Kind.AwaitKeyword: |
| 49 | isSync = true; |
| 50 | break; |
| 51 | default: |
| 52 | throw new Error(`unexpected keyword ${token.kind}`); |
| 53 | } |
| 54 | scanner.takeWhiteSpaceAndNewLines(); |
| 55 | } |
| 56 | |
| 57 | const filters = new Map<string, Filter | true>(); // <name, filterFn> |
| 58 | |
| 59 | function addFilter(name: string) { |
| 60 | scanner.takeWhiteSpaceAndNewLines(); |
| 61 | token = scanner.take(); |
| 62 | if (token.kind === Kind.OpenBracket) { |
| 63 | // has a filter expression of some kind. |
| 64 | filters.set(name, generateFilterFn(scanner)); |
| 65 | token = scanner.take(); |
| 66 | } else { |
| 67 | // if there isn't a filter, then we just need to add a filter with 'true' |
| 68 | filters.set(name, true); |
| 69 | } |
| 70 | scanner.takeWhiteSpaceAndNewLines(); |
| 71 | return token.kind === Kind.EndOfFile; |
| 72 | } |
| 73 | |
| 74 | processing: |
| 75 | do { |
| 76 | switch (token.kind) { |
| 77 | case Kind.EndOfFile: |
| 78 | break processing; |
| 79 | |
| 80 | case Kind.Slash: |
| 81 | // separator - skip this token (we can skip over multiple slashes, it's ok...) |
no test coverage detected