diff options
| author | Akshay Nair <phenax5@gmail.com> | 2023-08-11 17:13:33 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2023-08-11 17:13:33 +0530 |
| commit | 67748db74f73343b054ee0af1763e376a5470416 (patch) | |
| tree | 39b8df64ea1d657ef107fcdfed2da8ce66063589 /src/eval.ts | |
| parent | dfd4da6ca2d06c9d05d5c7e297304316da211dd4 (diff) | |
| download | css-everything-67748db74f73343b054ee0af1763e376a5470416.tar.gz css-everything-67748db74f73343b054ee0af1763e376a5470416.zip | |
feat: adds more functions for eval
Diffstat (limited to 'src/eval.ts')
| -rw-r--r-- | src/eval.ts | 58 |
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, }) + |
