98 lines
3.5 KiB
TypeScript
98 lines
3.5 KiB
TypeScript
import {TemplateContext} from "../../templates/template-context";
|
|
import {TemplateToken} from "../../templates/tokens";
|
|
import {TokenType} from "../../templates/tokens/types";
|
|
import {ReusableWorkflowJob} from "../workflow-template";
|
|
import {handleTemplateTokenErrors} from "./handle-errors";
|
|
import {convertWorkflowJobInputs} from "./job/inputs";
|
|
import {convertJobs} from "./jobs";
|
|
|
|
export function convertReferencedWorkflow(
|
|
context: TemplateContext,
|
|
referencedWorkflow: TemplateToken,
|
|
job: ReusableWorkflowJob
|
|
) {
|
|
const mapping = referencedWorkflow.assertMapping("root");
|
|
|
|
// The language service doesn't currently handles on other documents,
|
|
// So use the ref in the original workflow as the error location
|
|
const tokenForErrors = job.ref;
|
|
|
|
for (const pair of mapping) {
|
|
const key = pair.key.assertString("root key");
|
|
switch (key.value) {
|
|
case "on": {
|
|
handleTemplateTokenErrors(tokenForErrors, context, undefined, () =>
|
|
convertReferencedWorkflowOn(context, pair.value, job)
|
|
);
|
|
break;
|
|
}
|
|
case "jobs": {
|
|
job.jobs = handleTemplateTokenErrors(tokenForErrors, context, [], () => convertJobs(context, pair.value));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function convertReferencedWorkflowOn(context: TemplateContext, on: TemplateToken, job: ReusableWorkflowJob) {
|
|
const tokenForErrors = job.ref;
|
|
switch (on.templateTokenType) {
|
|
case TokenType.String: {
|
|
const event = on.assertString("Reference workflow on value").value;
|
|
if (event === "workflow_call") {
|
|
handleTemplateTokenErrors(tokenForErrors, context, undefined, () => convertWorkflowJobInputs(context, job));
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case TokenType.Sequence: {
|
|
const events = on.assertSequence("Reference workflow on value");
|
|
for (const eventToken of events) {
|
|
const event = eventToken.assertString(`Reference workflow on value ${eventToken}`).value;
|
|
if (event === "workflow_call") {
|
|
handleTemplateTokenErrors(tokenForErrors, context, undefined, () => convertWorkflowJobInputs(context, job));
|
|
return;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case TokenType.Mapping: {
|
|
const eventMapping = on.assertMapping("Reference workflow on value");
|
|
|
|
for (const pair of eventMapping) {
|
|
const event = pair.key.assertString(`Reference workflow on value ${pair.key}`).value;
|
|
if (event !== "workflow_call") {
|
|
continue;
|
|
}
|
|
|
|
if (pair.value.templateTokenType === TokenType.Null) {
|
|
handleTemplateTokenErrors(tokenForErrors, context, undefined, () => convertWorkflowJobInputs(context, job));
|
|
return;
|
|
}
|
|
|
|
const definitions = pair.value.assertMapping(`Reference workflow on value ${pair.key}`);
|
|
for (const definition of definitions) {
|
|
const definitionKey = definition.key.assertString(`on-workflow_call-${definition.key}`).value;
|
|
switch (definitionKey) {
|
|
case "inputs":
|
|
job["input-definitions"] = definition.value.assertMapping(`on-workflow_call-${definition.key}`);
|
|
break;
|
|
|
|
case "outputs":
|
|
job.outputs = definition.value.assertMapping(`on-workflow_call-${definition.key}`);
|
|
break;
|
|
}
|
|
}
|
|
|
|
handleTemplateTokenErrors(tokenForErrors, context, undefined, () => convertWorkflowJobInputs(context, job));
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
context.error(tokenForErrors, "workflow_call key is not defined in the referenced workflow.");
|
|
}
|