aboutsummaryrefslogtreecommitdiff
path: root/src/eval.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.ts')
-rw-r--r--src/eval.ts58
1 files changed, 40 insertions, 18 deletions
diff --git a/src/eval.ts b/src/eval.ts
index 76eaa21..03391c2 100644
--- a/src/eval.ts
+++ b/src/eval.ts
@@ -1,46 +1,67 @@
import { Expr } from "./parser";
import { match, matchString } from "./utils/adt";
-export type Dependencies = {
+export type EvalActions = {
addClass(id: string, classes: string): Promise<void>
removeClass(id: string, classes: string): Promise<void>
delay(num: number): Promise<void>
jsEval(js: string): Promise<any>
- // loadCssx(id: string, url: string): Promise<string>
- // getVarable(name: string, def?: string): Promise<string>
- // updateVariable(id: string, varName: string, value: string): Promise<void>
+ loadCssx(id: string, url: string): Promise<string>
+ getVariable(name: string): Promise<string | undefined>
+ updateVariable(id: string, varName: string, value: string): Promise<void>
// calculate ??
}
-export const evalExpr = async (expr: Expr, deps: Dependencies): Promise<string | undefined> =>
- match<Promise<string | undefined>, Expr>(expr, {
+type EvalValue = string | undefined | void
+
+export const evalExpr = async (expr: Expr, actions: EvalActions): Promise<EvalValue> =>
+ match<Promise<EvalValue>, Expr>(expr, {
Call: async ({ name, args }) => {
- await matchString(name, {
+ return matchString<Promise<EvalValue>, string>(name, {
'add-class': async () => {
- const id = await evalExpr(args[0], deps)
- const classes = await evalExpr(args[1], deps)
+ const id = await evalExpr(args[0], actions)
+ const classes = await evalExpr(args[1], actions)
if (id && classes) {
- await deps.addClass(id, classes)
+ await actions.addClass(id, classes)
}
},
'remove-class': async () => {
- const id = await evalExpr(args[0], deps)
- const classes = await evalExpr(args[1], deps)
+ const id = await evalExpr(args[0], actions)
+ const classes = await evalExpr(args[1], actions)
if (id && classes) {
- await deps.removeClass(id, classes)
+ await actions.removeClass(id, classes)
}
},
'delay': async () => {
- const num = await evalExpr(args[0], deps)
- num && await deps.delay(parseInt(num, 10))
+ const num = await evalExpr(args[0], actions)
+ num && await actions.delay(parseInt(num, 10))
},
'js-eval': async () => {
- const js = await evalExpr(args[0], deps)
- js && await deps.jsEval(js)
+ const js = await evalExpr(args[0], actions)
+ js && await actions.jsEval(js)
+ },
+ 'load-cssx': async () => {
+ const id = await evalExpr(args[0], actions)
+ const url = await evalExpr(args[1], actions)
+ if (id && url) {
+ await actions.loadCssx(id, url)
+ }
+ },
+ 'var': async () => {
+ const varName = await evalExpr(args[0], actions)
+ const defaultValue = await evalExpr(args[1], actions)
+ return varName && (actions.getVariable(varName) ?? defaultValue)
+ },
+ 'update': async () => {
+ const id = await evalExpr(args[0], actions)
+ const varName = await evalExpr(args[1], actions)
+ const value = await evalExpr(args[2], actions)
+ if (id && varName && value) {
+ actions.updateVariable(id, varName, value)
+ }
},
_: () => Promise.reject(new Error('not supposed to be here')),
})
- return undefined
},
LiteralString: async s => s,
Identifier: async s => s,
@@ -48,3 +69,4 @@ export const evalExpr = async (expr: Expr, deps: Dependencies): Promise<string |
_: async _ => undefined,
})
+