Add object property validation in parser #369
This commit introduces stricter type validation across the application to reject objects with unexpected properties, enhancing the robustness and predictability of data handling. Changes include: - Implement a common utility to validate object types. - Refactor across various parsers and data handlers to utilize the new validations. - Update error messages for better clarity and troubleshooting.
This commit is contained in:
@@ -1,40 +1,48 @@
|
||||
import type { CollectionData } from '@/application/collections/';
|
||||
import type { IApplication } from '@/domain/IApplication';
|
||||
import type { ProjectDetails } from '@/domain/Project/ProjectDetails';
|
||||
import type { ICategoryCollection } from '@/domain/ICategoryCollection';
|
||||
import WindowsData from '@/application/collections/windows.yaml';
|
||||
import MacOsData from '@/application/collections/macos.yaml';
|
||||
import LinuxData from '@/application/collections/linux.yaml';
|
||||
import { parseProjectDetails } from '@/application/Parser/ProjectDetailsParser';
|
||||
import { parseProjectDetails, type ProjectDetailsParser } from '@/application/Parser/ProjectDetailsParser';
|
||||
import { Application } from '@/domain/Application';
|
||||
import type { IAppMetadata } from '@/infrastructure/EnvironmentVariables/IAppMetadata';
|
||||
import { EnvironmentVariablesFactory } from '@/infrastructure/EnvironmentVariables/EnvironmentVariablesFactory';
|
||||
import { parseCategoryCollection } from './CategoryCollectionParser';
|
||||
import { parseCategoryCollection, type CategoryCollectionParser } from './CategoryCollectionParser';
|
||||
import { createTypeValidator, type TypeValidator } from './Common/TypeValidator';
|
||||
|
||||
export function parseApplication(
|
||||
categoryParser = parseCategoryCollection,
|
||||
projectDetailsParser = parseProjectDetails,
|
||||
metadata: IAppMetadata = EnvironmentVariablesFactory.Current.instance,
|
||||
collectionsData = PreParsedCollections,
|
||||
collectionsData: readonly CollectionData[] = PreParsedCollections,
|
||||
utilities: ApplicationParserUtilities = DefaultUtilities,
|
||||
): IApplication {
|
||||
validateCollectionsData(collectionsData);
|
||||
const projectDetails = projectDetailsParser(metadata);
|
||||
validateCollectionsData(collectionsData, utilities.validator);
|
||||
const projectDetails = utilities.parseProjectDetails();
|
||||
const collections = collectionsData.map(
|
||||
(collection) => categoryParser(collection, projectDetails),
|
||||
(collection) => utilities.parseCategoryCollection(collection, projectDetails),
|
||||
);
|
||||
const app = new Application(projectDetails, collections);
|
||||
return app;
|
||||
}
|
||||
|
||||
export type CategoryCollectionParserType
|
||||
= (file: CollectionData, projectDetails: ProjectDetails) => ICategoryCollection;
|
||||
|
||||
const PreParsedCollections: readonly CollectionData [] = [
|
||||
const PreParsedCollections: readonly CollectionData[] = [
|
||||
WindowsData, MacOsData, LinuxData,
|
||||
];
|
||||
|
||||
function validateCollectionsData(collections: readonly CollectionData[]) {
|
||||
if (!collections.length) {
|
||||
throw new Error('missing collections');
|
||||
}
|
||||
function validateCollectionsData(
|
||||
collections: readonly CollectionData[],
|
||||
validator: TypeValidator,
|
||||
) {
|
||||
validator.assertNonEmptyCollection({
|
||||
value: collections,
|
||||
valueName: 'collections',
|
||||
});
|
||||
}
|
||||
|
||||
interface ApplicationParserUtilities {
|
||||
readonly parseCategoryCollection: CategoryCollectionParser;
|
||||
readonly validator: TypeValidator;
|
||||
readonly parseProjectDetails: ProjectDetailsParser;
|
||||
}
|
||||
|
||||
const DefaultUtilities: ApplicationParserUtilities = {
|
||||
parseCategoryCollection,
|
||||
parseProjectDetails,
|
||||
validator: createTypeValidator(),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user