add support for shared functions #41
This commit is contained in:
@@ -2,15 +2,18 @@ import { Script } from '@/domain/Script';
|
||||
import { YamlScript } from 'js-yaml-loader!./application.yaml';
|
||||
import { parseDocUrls } from './DocumentationParser';
|
||||
import { RecommendationLevelNames, RecommendationLevel } from '@/domain/RecommendationLevel';
|
||||
import { IScriptCompiler } from './Compiler/IScriptCompiler';
|
||||
import { IScriptCode } from '@/domain/IScriptCode';
|
||||
import { ScriptCode } from '@/domain/ScriptCode';
|
||||
|
||||
export function parseScript(yamlScript: YamlScript): Script {
|
||||
if (!yamlScript) {
|
||||
throw new Error('script is null or undefined');
|
||||
export function parseScript(yamlScript: YamlScript, compiler: IScriptCompiler): Script {
|
||||
validateScript(yamlScript);
|
||||
if (!compiler) {
|
||||
throw new Error('undefined compiler');
|
||||
}
|
||||
const script = new Script(
|
||||
/* name */ yamlScript.name,
|
||||
/* code */ yamlScript.code,
|
||||
/* revertCode */ yamlScript.revertCode,
|
||||
/* code */ parseCode(yamlScript, compiler),
|
||||
/* docs */ parseDocUrls(yamlScript),
|
||||
/* level */ getLevel(yamlScript.recommend));
|
||||
return script;
|
||||
@@ -30,3 +33,29 @@ function getLevel(level: string): RecommendationLevel | undefined {
|
||||
}
|
||||
return RecommendationLevel[typedLevel as keyof typeof RecommendationLevel];
|
||||
}
|
||||
|
||||
function parseCode(yamlScript: YamlScript, compiler: IScriptCompiler): IScriptCode {
|
||||
if (compiler.canCompile(yamlScript)) {
|
||||
return compiler.compile(yamlScript);
|
||||
}
|
||||
return new ScriptCode(yamlScript.name, yamlScript.code, yamlScript.revertCode);
|
||||
}
|
||||
|
||||
function ensureNotBothCallAndCode(yamlScript: YamlScript) {
|
||||
if (yamlScript.code && yamlScript.call) {
|
||||
throw new Error('cannot define both "call" and "code"');
|
||||
}
|
||||
if (yamlScript.revertCode && yamlScript.call) {
|
||||
throw new Error('cannot define "revertCode" if "call" is defined');
|
||||
}
|
||||
}
|
||||
|
||||
function validateScript(yamlScript: YamlScript) {
|
||||
if (!yamlScript) {
|
||||
throw new Error('undefined script');
|
||||
}
|
||||
if (!yamlScript.code && !yamlScript.call) {
|
||||
throw new Error('must define either "call" or "code"');
|
||||
}
|
||||
ensureNotBothCallAndCode(yamlScript);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user