Merge pull request #146 from github/joshmgross/error-policy-option
Move `ErrorPolicy` into template converter options
This commit is contained in:
@@ -77,15 +77,10 @@ export async function complete(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const {token, keyToken, parent, path} = findToken(newPos, result.value);
|
const {token, keyToken, parent, path} = findToken(newPos, result.value);
|
||||||
const template = await convertWorkflowTemplate(
|
const template = await convertWorkflowTemplate(result.context, result.value, config?.fileProvider, {
|
||||||
result.context,
|
fetchReusableWorkflowDepth: config?.fileProvider ? 1 : 0,
|
||||||
result.value,
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
ErrorPolicy.TryConversion,
|
});
|
||||||
config?.fileProvider,
|
|
||||||
{
|
|
||||||
fetchReusableWorkflowDepth: config?.fileProvider ? 1 : 0
|
|
||||||
}
|
|
||||||
);
|
|
||||||
const workflowContext = getWorkflowContext(textDocument.uri, template, path);
|
const workflowContext = getWorkflowContext(textDocument.uri, template, path);
|
||||||
|
|
||||||
// If we are inside an expression, take a different code-path. The workflow parser does not correctly create
|
// If we are inside an expression, take a different code-path. The workflow parser does not correctly create
|
||||||
|
|||||||
@@ -19,7 +19,9 @@ export async function documentLinks(document: TextDocument): Promise<DocumentLin
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value!, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
|
|
||||||
// Add links to referenced actions
|
// Add links to referenced actions
|
||||||
const actionLinks: DocumentLink[] = [];
|
const actionLinks: DocumentLink[] = [];
|
||||||
|
|||||||
@@ -110,7 +110,9 @@ async function hoverExpression(input: string) {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
const workflowContext = getWorkflowContext(td.uri, template, []);
|
const workflowContext = getWorkflowContext(td.uri, template, []);
|
||||||
const context = await getContext(allowedContext, contextProviderConfig, workflowContext, Mode.Completion);
|
const context = await getContext(allowedContext, contextProviderConfig, workflowContext, Mode.Completion);
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,9 @@ export async function hover(document: TextDocument, position: Position, config?:
|
|||||||
const allowedContext = tokenDefinitionInfo.allowedContext || [];
|
const allowedContext = tokenDefinitionInfo.allowedContext || [];
|
||||||
const {namedContexts, functions} = splitAllowedContext(allowedContext);
|
const {namedContexts, functions} = splitAllowedContext(allowedContext);
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
const workflowContext = getWorkflowContext(document.uri, template, tokenResult.path);
|
const workflowContext = getWorkflowContext(document.uri, template, tokenResult.path);
|
||||||
const context = await getContext(namedContexts, config?.contextProviderConfig, workflowContext, Mode.Completion);
|
const context = await getContext(namedContexts, config?.contextProviderConfig, workflowContext, Mode.Completion);
|
||||||
|
|
||||||
@@ -107,7 +109,9 @@ async function getDescription(
|
|||||||
return defaultDescription;
|
return defaultDescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
const workflowContext = getWorkflowContext(document.uri, template, path);
|
const workflowContext = getWorkflowContext(document.uri, template, path);
|
||||||
const description = await config.descriptionProvider.getDescription(workflowContext, token, path);
|
const description = await config.descriptionProvider.getDescription(workflowContext, token, path);
|
||||||
return description || defaultDescription;
|
return description || defaultDescription;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export async function testGetWorkflowContext(input: string): Promise<WorkflowCon
|
|||||||
let template: WorkflowTemplate | undefined;
|
let template: WorkflowTemplate | undefined;
|
||||||
|
|
||||||
if (result.value) {
|
if (result.value) {
|
||||||
template = await convertWorkflowTemplate(result.context, result.value, undefined, testFileProvider, {
|
template = await convertWorkflowTemplate(result.context, result.value, testFileProvider, {
|
||||||
fetchReusableWorkflowDepth: 1
|
fetchReusableWorkflowDepth: 1
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,15 +57,10 @@ export async function validate(textDocument: TextDocument, config?: ValidationCo
|
|||||||
const result: ParseWorkflowResult = parseWorkflow(file, nullTrace);
|
const result: ParseWorkflowResult = parseWorkflow(file, nullTrace);
|
||||||
if (result.value) {
|
if (result.value) {
|
||||||
// Errors will be updated in the context. Attempt to do the conversion anyway in order to give the user more information
|
// Errors will be updated in the context. Attempt to do the conversion anyway in order to give the user more information
|
||||||
const template = await convertWorkflowTemplate(
|
const template = await convertWorkflowTemplate(result.context, result.value, config?.fileProvider, {
|
||||||
result.context,
|
fetchReusableWorkflowDepth: config?.fileProvider ? 1 : 0,
|
||||||
result.value,
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
ErrorPolicy.TryConversion,
|
});
|
||||||
config?.fileProvider,
|
|
||||||
{
|
|
||||||
fetchReusableWorkflowDepth: config?.fileProvider ? 1 : 0
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// Validate expressions and value providers
|
// Validate expressions and value providers
|
||||||
await additionalValidations(diagnostics, textDocument.uri, template, result.value, config);
|
await additionalValidations(diagnostics, textDocument.uri, template, result.value, config);
|
||||||
|
|||||||
@@ -19,7 +19,9 @@ jobs:
|
|||||||
nullTrace
|
nullTrace
|
||||||
);
|
);
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value!, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
|
|
||||||
expect(serializeTemplate(template)).toEqual({
|
expect(serializeTemplate(template)).toEqual({
|
||||||
events: {
|
events: {
|
||||||
@@ -59,7 +61,9 @@ jobs:
|
|||||||
nullTrace
|
nullTrace
|
||||||
);
|
);
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value!, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
|
|
||||||
expect(serializeTemplate(template)).toEqual({
|
expect(serializeTemplate(template)).toEqual({
|
||||||
events: {
|
events: {
|
||||||
@@ -105,7 +109,9 @@ jobs:
|
|||||||
nullTrace
|
nullTrace
|
||||||
);
|
);
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value!, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
|
|
||||||
expect(serializeTemplate(template)).toEqual({
|
expect(serializeTemplate(template)).toEqual({
|
||||||
errors: [
|
errors: [
|
||||||
@@ -152,7 +158,9 @@ jobs:
|
|||||||
nullTrace
|
nullTrace
|
||||||
);
|
);
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value!, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
|
|
||||||
expect(serializeTemplate(template)).toEqual({
|
expect(serializeTemplate(template)).toEqual({
|
||||||
errors: [
|
errors: [
|
||||||
@@ -229,7 +237,9 @@ jobs:
|
|||||||
nullTrace
|
nullTrace
|
||||||
);
|
);
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value!, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
|
|
||||||
expect(template.jobs).not.toBeUndefined();
|
expect(template.jobs).not.toBeUndefined();
|
||||||
expect(template.jobs).toHaveLength(1);
|
expect(template.jobs).toHaveLength(1);
|
||||||
@@ -282,7 +292,9 @@ jobs:
|
|||||||
nullTrace
|
nullTrace
|
||||||
);
|
);
|
||||||
|
|
||||||
const template = await convertWorkflowTemplate(result.context, result.value!, ErrorPolicy.TryConversion);
|
const template = await convertWorkflowTemplate(result.context, result.value!, undefined, {
|
||||||
|
errorPolicy: ErrorPolicy.TryConversion
|
||||||
|
});
|
||||||
|
|
||||||
expect(template.jobs).not.toBeUndefined();
|
expect(template.jobs).not.toBeUndefined();
|
||||||
expect(template.jobs).toHaveLength(0);
|
expect(template.jobs).toHaveLength(0);
|
||||||
|
|||||||
@@ -31,31 +31,36 @@ export type WorkflowTemplateConverterOptions = {
|
|||||||
* Default: 0
|
* Default: 0
|
||||||
*/
|
*/
|
||||||
fetchReusableWorkflowDepth?: number;
|
fetchReusableWorkflowDepth?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error policy to use when converting the workflow.
|
||||||
|
* By default, conversion will be skipped if there are errors in the {@link TemplateContext}.
|
||||||
|
*/
|
||||||
|
errorPolicy?: ErrorPolicy;
|
||||||
};
|
};
|
||||||
|
|
||||||
const defaultOptions: Required<WorkflowTemplateConverterOptions> = {
|
const defaultOptions: Required<WorkflowTemplateConverterOptions> = {
|
||||||
maxReusableWorkflowDepth: 4,
|
maxReusableWorkflowDepth: 4,
|
||||||
fetchReusableWorkflowDepth: 0
|
fetchReusableWorkflowDepth: 0,
|
||||||
|
errorPolicy: ErrorPolicy.ReturnErrorsOnly
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function convertWorkflowTemplate(
|
export async function convertWorkflowTemplate(
|
||||||
context: TemplateContext,
|
context: TemplateContext,
|
||||||
root: TemplateToken,
|
root: TemplateToken,
|
||||||
errorPolicy: ErrorPolicy = ErrorPolicy.ReturnErrorsOnly,
|
|
||||||
fileProvider?: FileProvider,
|
fileProvider?: FileProvider,
|
||||||
options: WorkflowTemplateConverterOptions = defaultOptions
|
options: WorkflowTemplateConverterOptions = defaultOptions
|
||||||
): Promise<WorkflowTemplate> {
|
): Promise<WorkflowTemplate> {
|
||||||
const result = {} as WorkflowTemplate;
|
const result = {} as WorkflowTemplate;
|
||||||
|
const opts = getOptionsWithDefaults(options);
|
||||||
|
|
||||||
if (context.errors.getErrors().length > 0 && errorPolicy === ErrorPolicy.ReturnErrorsOnly) {
|
if (context.errors.getErrors().length > 0 && opts.errorPolicy === ErrorPolicy.ReturnErrorsOnly) {
|
||||||
result.errors = context.errors.getErrors().map(x => ({
|
result.errors = context.errors.getErrors().map(x => ({
|
||||||
Message: x.message
|
Message: x.message
|
||||||
}));
|
}));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const opts = getOptionsWithDefaults(options);
|
|
||||||
|
|
||||||
if (fileProvider === undefined && opts.fetchReusableWorkflowDepth > 0) {
|
if (fileProvider === undefined && opts.fetchReusableWorkflowDepth > 0) {
|
||||||
context.error(root, new Error("A file provider is required to fetch reusable workflows"));
|
context.error(root, new Error("A file provider is required to fetch reusable workflows"));
|
||||||
}
|
}
|
||||||
@@ -136,6 +141,7 @@ function getOptionsWithDefaults(options: WorkflowTemplateConverterOptions): Requ
|
|||||||
fetchReusableWorkflowDepth:
|
fetchReusableWorkflowDepth:
|
||||||
options.fetchReusableWorkflowDepth !== undefined
|
options.fetchReusableWorkflowDepth !== undefined
|
||||||
? options.fetchReusableWorkflowDepth
|
? options.fetchReusableWorkflowDepth
|
||||||
: defaultOptions.fetchReusableWorkflowDepth
|
: defaultOptions.fetchReusableWorkflowDepth,
|
||||||
|
errorPolicy: options.errorPolicy !== undefined ? options.errorPolicy : defaultOptions.errorPolicy
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,6 @@ describe("x-lang tests", () => {
|
|||||||
const workflowTemplate = await convertWorkflowTemplate(
|
const workflowTemplate = await convertWorkflowTemplate(
|
||||||
parseResult.context,
|
parseResult.context,
|
||||||
parseResult.value!,
|
parseResult.value!,
|
||||||
undefined,
|
|
||||||
testFileProvider,
|
testFileProvider,
|
||||||
{
|
{
|
||||||
fetchReusableWorkflowDepth: 1
|
fetchReusableWorkflowDepth: 1
|
||||||
|
|||||||
Reference in New Issue
Block a user