Skip to content

Commit

Permalink
Implemented logic to output diagnostics log by adding additional outp…
Browse files Browse the repository at this point in the history
…ut flag
  • Loading branch information
SahilDahekar committed Oct 30, 2024
1 parent a2c2202 commit 1e23c08
Showing 1 changed file with 48 additions and 2 deletions.
50 changes: 48 additions & 2 deletions src/core/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,22 @@ import { red, yellow, green, cyan } from 'chalk';
import type { Diagnostic } from '@asyncapi/parser/cjs';
import type Command from './base';
import type { Specification } from './models/SpecificationFile';
import { promises } from 'fs';
import path from 'path';

const { writeFile } = promises;

type DiagnosticsFormat = 'stylish' | 'json' | 'junit' | 'html' | 'text' | 'teamcity' | 'pretty';

const formatExtensions: Record<DiagnosticsFormat, string> = {
stylish: '.txt',
json: '.json',
junit: '.xml',
html: '.html',
text: '.txt',
teamcity: '.txt',
pretty: '.txt',
};

export type SeverityKind = 'error' | 'warn' | 'info' | 'hint';

Expand Down Expand Up @@ -56,13 +72,18 @@ export function validationFlags({ logDiagnostics = true }: ValidationFlagsOption
options: ['error', 'warn', 'info', 'hint'] as const,
default: 'error',
})(),
'output': Flags.string({
description: 'The output file name. Omitting this flag the result will be printed in the console.',
char: 'o'
})
};
}

export interface ValidateOptions {
'log-diagnostics'?: boolean;
'diagnostics-format'?: `${OutputFormat}`;
'fail-severity'?: SeverityKind;
'output'?: string;
}

export async function validate(command: Command, specFile: Specification, options: ValidateOptions = {}) {
Expand All @@ -86,14 +107,24 @@ function logDiagnostics(diagnostics: Diagnostic[], command: Command, specFile: S
if (hasFailSeverity(diagnostics, failSeverity)) {
if (logDiagnostics) {
command.logToStderr(`\n${sourceString} and/or referenced documents have governance issues.`);
command.logToStderr(formatOutput(diagnostics, diagnosticsFormat, failSeverity));
const diagnosticsOutput = formatOutput(diagnostics, diagnosticsFormat, failSeverity);
if (options.output) {
writeValidationDiagnostic(options.output, command, diagnosticsFormat, diagnosticsOutput);
} else {
command.log(diagnosticsOutput);
}
}
return ValidationStatus.INVALID;
}

if (logDiagnostics) {
command.log(`\n${sourceString} is valid but has (itself and/or referenced documents) governance issues.`);
command.log(formatOutput(diagnostics, diagnosticsFormat, failSeverity));
const diagnosticsOutput = formatOutput(diagnostics, diagnosticsFormat, failSeverity);
if (options.output) {
writeValidationDiagnostic(options.output, command, diagnosticsFormat, diagnosticsOutput);
} else {
command.log(diagnosticsOutput);
}
}
} else if (logDiagnostics) {
command.log(`\n${sourceString} is valid! ${sourceString} and referenced documents don't have governance issues.`);
Expand Down Expand Up @@ -145,3 +176,18 @@ function hasFailSeverity(diagnostics: Diagnostic[], failSeverity: SeverityKind)
const diagnosticSeverity = getDiagnosticSeverity(failSeverity);
return diagnostics.some(diagnostic => diagnostic.severity <= diagnosticSeverity);
}

async function writeValidationDiagnostic(outputPath: string, command: Command, format: DiagnosticsFormat, formatOutput: string){
const expectedExtension = formatExtensions[format];
const actualExtension = path.extname(outputPath);

// Validate file extension against diagnostics format
if (expectedExtension && (actualExtension !== expectedExtension)) {
command.logToStderr(`Invalid file extension for format "${format}". Expected extension: "${expectedExtension}"`);
} else {
await writeFile(path.resolve(process.cwd(), outputPath), formatOutput, {
encoding: 'utf-8',
}).catch(err => console.log(err));
}

}

0 comments on commit 1e23c08

Please sign in to comment.