Skip to content

Commit

Permalink
Refactoring into generics to avoid using "as"
Browse files Browse the repository at this point in the history
  • Loading branch information
cesarParra committed Oct 17, 2024
1 parent abc3f6c commit f68946c
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 39 deletions.
16 changes: 7 additions & 9 deletions src/application/Apexdocs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import {
} from '../core/shared/types';
import { ReflectionError, ReflectionErrors, HookError } from '../core/errors/errors';
import { FileReadingError, FileWritingError } from './errors';
import { apply } from '#utils/fp';

/**
* Application entry-point to generate documentation out of Apex source files.
Expand Down Expand Up @@ -46,32 +45,31 @@ export class Apexdocs {
}
}

const readFiles = apply(processFiles, new DefaultFileSystem());
const readFiles = processFiles(new DefaultFileSystem());

async function processMarkdown(config: UserDefinedMarkdownConfig) {
// TODO: Also process Object files
return pipe(
TE.tryCatch(
() => readFiles(config.sourceDir, config.exclude, [processApexFiles(config.includeMetadata)]),
() => readFiles([processApexFiles(config.includeMetadata)])(config.sourceDir, config.exclude),
(e) => new FileReadingError('An error occurred while reading files.', e),
),
TE.flatMap((fileBodies) => markdown(fileBodies as UnparsedApexFile[], config)),
TE.flatMap((fileBodies) => markdown(fileBodies, config)),
TE.map(() => '✔️ Documentation generated successfully!'),
TE.mapLeft(toErrors),
);
}

async function processOpenApi(config: UserDefinedOpenApiConfig, logger: Logger) {
const fileBodies = (await readFiles(config.sourceDir, config.exclude, [
processApexFiles(false),
])) as UnparsedApexFile[];
const fileBodies = await readFiles([processApexFiles(false)])(config.sourceDir, config.exclude);
return openApi(logger, fileBodies, config);
}

async function processChangeLog(config: UserDefinedChangelogConfig) {
async function loadFiles(): Promise<[UnparsedApexFile[], UnparsedApexFile[]]> {
return [
(await readFiles(config.previousVersionDir, config.exclude, [processApexFiles(false)])) as UnparsedApexFile[],
(await readFiles(config.currentVersionDir, config.exclude, [processApexFiles(false)])) as UnparsedApexFile[],
await readFiles([processApexFiles(false)])(config.previousVersionDir, config.exclude),
await readFiles([processApexFiles(false)])(config.currentVersionDir, config.exclude),
];
}

Expand Down
12 changes: 6 additions & 6 deletions src/application/__tests__/source-code-file-reader.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ describe('File Reader', () => {
},
]);

const result = await processFiles(fileSystem, '', [], [processApexFiles(false)]);
const result = await processFiles(fileSystem)([processApexFiles(false)])('', []);

expect(result.length).toBe(0);
});
Expand All @@ -90,7 +90,7 @@ describe('File Reader', () => {
},
]);

const result = await processFiles(fileSystem, '', [], [processApexFiles(false)]);
const result = await processFiles(fileSystem)([processApexFiles(false)])('', []);
expect(result.length).toBe(0);
});

Expand Down Expand Up @@ -120,7 +120,7 @@ describe('File Reader', () => {
},
]);

const result = await processFiles(fileSystem, '', [], [processApexFiles(false)]);
const result = await processFiles(fileSystem)([processApexFiles(false)])('', []);
expect(result.length).toBe(2);
expect(result[0].content).toBe('public class MyClass{}');
expect(result[1].content).toBe('public class AnotherClass{}');
Expand Down Expand Up @@ -150,7 +150,7 @@ describe('File Reader', () => {
},
]);

const result = await processFiles(fileSystem, '', [], [processObjectFiles()]);
const result = await processFiles(fileSystem)([processObjectFiles()])('', []);
expect(result.length).toBe(1);
expect(result[0].content).toBe(objectContent);
});
Expand Down Expand Up @@ -181,7 +181,7 @@ describe('File Reader', () => {
},
]);

const result = await processFiles(fileSystem, '', ['**/AnotherFile.cls'], [processApexFiles(false)]);
const result = await processFiles(fileSystem)([processApexFiles(false)])('', ['**/AnotherFile.cls']);
expect(result.length).toBe(1);
expect(result[0].content).toBe('public class MyClass{}');
});
Expand Down Expand Up @@ -234,7 +234,7 @@ describe('File Reader', () => {
},
]);

const result = await processFiles(fileSystem, '', [], [processApexFiles(false)]);
const result = await processFiles(fileSystem)([processApexFiles(false)])('', []);
expect(result.length).toBe(4);
});
});
45 changes: 22 additions & 23 deletions src/application/source-code-file-reader.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
import { FileSystem } from './file-system';
import { UnparsedApexFile, UnparsedSourceFile } from '../core/shared/types';
import { UnparsedApexFile, UnparsedObjectFile } from '../core/shared/types';
import { minimatch } from 'minimatch';
import { pipe } from 'fp-ts/function';

/**
* Reads from .cls files and returns their raw body.
*/
export async function processFiles(
fileSystem: FileSystem,
rootPath: string,
exclude: string[],
processors: FileProcessor[],
): Promise<UnparsedSourceFile[]> {
return pipe(
await getFilePaths(fileSystem, rootPath),
(filePaths) => filePaths.filter((filePath) => !isExcluded(filePath, exclude)),
(filteredFilePaths) => readFiles(fileSystem, filteredFilePaths, processors),
);
export function processFiles(fileSystem: FileSystem) {
return function <T extends UnparsedApexFile | UnparsedObjectFile>(processors: FileProcessor<T>[]) {
return async function (rootPath: string, exclude: string[]): Promise<T[]> {
return pipe(
await getFilePaths(fileSystem, rootPath),
(filePaths) => filePaths.filter((filePath) => !isExcluded(filePath, exclude)),
(filteredFilePaths) => readFiles(fileSystem, filteredFilePaths, processors),
);
};
};
}

async function readFiles(
async function readFiles<T extends UnparsedApexFile | UnparsedObjectFile>(
fileSystem: FileSystem,
filePaths: string[],
processors: FileProcessor[],
): Promise<UnparsedSourceFile[]> {
const files: UnparsedSourceFile[] = [];
processors: FileProcessor<T>[],
): Promise<T[]> {
const files: T[] = [];
for (const filePath of filePaths) {
const processor = processors.find((p) => p.isSupportedFile(filePath));
if (processor) {
Expand Down Expand Up @@ -52,16 +51,16 @@ function isExcluded(filePath: string, exclude: string[]): boolean {
return exclude.some((pattern) => minimatch(filePath, pattern));
}

interface FileProcessor {
interface FileProcessor<T extends UnparsedApexFile | UnparsedObjectFile> {
isSupportedFile: (currentFile: string) => boolean;
process: (fileSystem: FileSystem, filePath: string) => Promise<UnparsedSourceFile>;
process: (fileSystem: FileSystem, filePath: string) => Promise<T>;
}

export function processApexFiles(includeMetadata: boolean): FileProcessor {
export function processApexFiles(includeMetadata: boolean): FileProcessor<UnparsedApexFile> {
return new ApexFileReader(includeMetadata);
}

class ApexFileReader implements FileProcessor {
class ApexFileReader implements FileProcessor<UnparsedApexFile> {
APEX_FILE_EXTENSION = '.cls';

constructor(public includeMetadata: boolean) {}
Expand All @@ -82,18 +81,18 @@ class ApexFileReader implements FileProcessor {
}
}

export function processObjectFiles(): FileProcessor {
export function processObjectFiles(): FileProcessor<UnparsedObjectFile> {
return new ObjectFileReader();
}

class ObjectFileReader implements FileProcessor {
class ObjectFileReader implements FileProcessor<UnparsedObjectFile> {
OBJECT_FILE_EXTENSION = '.object-meta.xml';

isSupportedFile(currentFile: string): boolean {
return currentFile.endsWith(this.OBJECT_FILE_EXTENSION);
}

async process(fileSystem: FileSystem, filePath: string): Promise<UnparsedSourceFile> {
async process(fileSystem: FileSystem, filePath: string): Promise<UnparsedObjectFile> {
const rawTypeContent = await fileSystem.readFile(filePath);
return { type: 'object', filePath, content: rawTypeContent };
}
Expand Down
2 changes: 1 addition & 1 deletion src/core/shared/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export type UserDefinedChangelogConfig = {

export type UserDefinedConfig = UserDefinedMarkdownConfig | UserDefinedOpenApiConfig | UserDefinedChangelogConfig;

export type UnparsedSourceFile = UnparsedObjectFile | UnparsedApexFile;
export type UnparsedSourceFile = UnparsedApexFile | UnparsedObjectFile;

export type UnparsedObjectFile = {
type: 'object';
Expand Down

0 comments on commit f68946c

Please sign in to comment.