Merge pull request #146 from github/joshmgross/error-policy-option

Move `ErrorPolicy` into template converter options
This commit is contained in:
Josh Gross
2023-02-15 16:10:01 -05:00
committed by GitHub
9 changed files with 51 additions and 36 deletions
+4 -9
View File
@@ -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);
+6 -2
View File
@@ -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
}); });
} }
+4 -9
View File
@@ -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);
+12 -6
View File
@@ -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