Skip to content

Commit 44fb66c

Browse files
committed
wip(feat): add pattern for escaping token lookup()
Ref: #14
1 parent 5fe31e6 commit 44fb66c

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

lib/chain.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ const {object} = require('@logdna/stdlib')
55
const typeOf = require('./lang/type-of.js')
66
const builtins = require('./actions/index.js')
77
const {Parser, Lexer, Visitor} = require('./parser/index.js')
8-
const {BANG, HASH} = require('./parser/tokens.js')
8+
const {BANG, HASH, DASH} = require('./parser/tokens.js')
9+
const ESCAPE_TOKENS = new Set([DASH.name])
910
const PARSE_TOKENS = new Set([BANG.name, HASH.name])
1011

1112
const lookup = Symbol('lookup')
@@ -113,6 +114,10 @@ module.exports = class SetupChain {
113114
if (!lexed.tokens.length) return this.visitor.wrapLiteral(str)
114115

115116
const firstToken = lexed.tokens[0]
117+
if (ESCAPE_TOKENS.has(firstToken.tokenType.name)) {
118+
return this.visitor.wrapLiteral(str.slice(1))
119+
}
120+
116121
if (!PARSE_TOKENS.has(firstToken.tokenType.name)) {
117122
return this.visitor.wrapLiteral(str)
118123
}
@@ -155,7 +160,6 @@ module.exports = class SetupChain {
155160
const fn = this.actions[key]
156161
this.state[label || key] = await fn.apply(this, rest)
157162
} catch (err) {
158-
console.error(err)
159163
const error = new Error(`Setup Chain error in ${key}`)
160164
error.stack = err.stack
161165
error.chain_params = task

lib/parser/tokens.js

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ const BANG = createToken({
77
, pattern: /!/
88
})
99

10+
const DASH = createToken({
11+
name: 'dash'
12+
, pattern: /-/
13+
})
14+
1015
const COMMA = createToken({
1116
name: 'comma'
1217
, pattern: ','
@@ -54,6 +59,7 @@ const WHITE_SPACE = createToken({
5459
})
5560

5661
BANG.LABEL = '!'
62+
DASH.LABEL = '-'
5763
HASH.LABEL = '#'
5864
COMMA.LABEL = ','
5965
COLON.LABEL = ':'
@@ -66,6 +72,7 @@ module.exports = {
6672
, DOT
6773
, HASH
6874
, BANG
75+
, DASH
6976
, LPAREN
7077
, RPAREN
7178
, COMMA

test/integration/chain.js

+21
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,27 @@ test('Setup chain', async (t) => {
207207
}
208208
})
209209

210+
t.test('escape control', async (t) => {
211+
class EscapeChain extends Chain {
212+
constructor(state) {
213+
super(state)
214+
}
215+
216+
$test(arg) {
217+
return arg
218+
}
219+
}
220+
221+
const chain = new EscapeChain({f00: 'wrong'})
222+
chain.set('color', '-#f00')
223+
chain.set('rand', '-!random')
224+
chain.set('complex', '!test("-#foo")')
225+
const state = await chain.execute()
226+
t.equal(state.color, '#f00')
227+
t.equal(state.rand, '!random')
228+
t.equal(state.complex, '#foo')
229+
})
230+
210231
t.test('Default SetupChain (no actions, state); Only built-ins', async (t) => {
211232
const chain = new Chain(null, null)
212233
t.same(chain.state, {}, 'Empty state')

0 commit comments

Comments
 (0)