UNPKG

greybel-js

Version:

Transpiler/Interpreter for GreyScript. (GreyHack)

64 lines 2.74 kB
import { ModifierType } from 'another-ansi'; import { createGHMockEnv, init as initGHIntrinsics } from 'greybel-gh-mock-intrinsics'; import { HandlerContainer, ObjectValue, PrepareError, RuntimeError } from 'greybel-interpreter'; import { init as initIntrinsics } from 'greybel-intrinsics'; import { Interpreter } from 'greyscript-interpreter'; import { logger } from '../../helper/logger.js'; import { InterpreterResourceProvider } from '../../helper/resource.js'; import { ansiProvider, useColor } from '../output.js'; import GreybelPseudoDebugger from './debugger.js'; import CLIOutputHandler from './output.js'; export class MockSession { target; debugMode; envMapper; resourceHandler; runtime; seed; constructor({ target, envMapper, debugMode = false, seed }) { this.target = target; this.seed = seed; this.debugMode = debugMode; this.resourceHandler = new InterpreterResourceProvider(); this.envMapper = envMapper; this.runtime = null; } async prepare() { this.runtime = new Interpreter({ target: await this.resourceHandler.resolve(this.target), handler: new HandlerContainer({ outputHandler: new CLIOutputHandler(), resourceHandler: this.resourceHandler }), environmentVariables: this.envMapper.toMap(), debugMode: this.debugMode }); this.runtime.setApi(initIntrinsics(initGHIntrinsics(new ObjectValue(), createGHMockEnv(this.runtime, { seed: this.seed, myProgramContent: await this.resourceHandler.get(this.target) })))); this.runtime.setDebugger(new GreybelPseudoDebugger(this.runtime)); } async run(params = []) { try { const startTime = Date.now(); this.runtime.params = params; await this.runtime.run(); logger.debug(`Execution time: ${Date.now() - startTime}ms`); } catch (err) { if (err instanceof PrepareError) { logger.error(useColor('red', `${ansiProvider.modify(ModifierType.Bold, 'Prepare error')}: ${err.message} at ${err.target}:${err.range?.start || 0}`)); } else if (err instanceof RuntimeError) { logger.error(useColor('red', `${ansiProvider.modify(ModifierType.Bold, 'Runtime error')}: ${err.message} at ${err.target}\n${err.stack}`)); } else { logger.error(useColor('red', `${ansiProvider.modify(ModifierType.Bold, 'Unexpected error')}: ${err.message}\n${err.stack}`)); } return false; } return true; } } //# sourceMappingURL=session.js.map