This commit adds validation logic in compiler to check for max allowed characters per line for scripts. This allows preventing bugs caused by limitation of terminal emulators. Other supporting changes: - Rename/refactor related code for clarity and better maintainability. - Drop `I` prefix from interfaces to align with latest convention. - Refactor CodeValidator to be functional rather than object-oriented for simplicity. - Refactor syntax definition construction to be functional and be part of rule for better separation of concerns. - Refactored validation logic to use an enum-based factory pattern for improved maintainability and scalability.
76 lines
2.9 KiB
TypeScript
76 lines
2.9 KiB
TypeScript
import type { CollectionData } from '@/application/collections/';
|
|
import { OperatingSystem } from '@/domain/OperatingSystem';
|
|
import type { ICategoryCollection } from '@/domain/Collection/ICategoryCollection';
|
|
import { CategoryCollection } from '@/domain/Collection/CategoryCollection';
|
|
import type { ProjectDetails } from '@/domain/Project/ProjectDetails';
|
|
import { createEnumParser, type EnumParser } from '../Common/Enum';
|
|
import { parseCategory, type CategoryParser } from './Executable/CategoryParser';
|
|
import { parseScriptingDefinition, type ScriptingDefinitionParser } from './ScriptingDefinition/ScriptingDefinitionParser';
|
|
import { createTypeValidator, type TypeValidator } from './Common/TypeValidator';
|
|
import { createCategoryCollectionContext, type CategoryCollectionContextFactory } from './Executable/CategoryCollectionContext';
|
|
|
|
export const parseCategoryCollection: CategoryCollectionParser = (
|
|
content,
|
|
projectDetails,
|
|
utilities: CategoryCollectionParserUtilities = DefaultUtilities,
|
|
) => {
|
|
validateCollection(content, utilities.validator);
|
|
const scripting = utilities.parseScriptingDefinition(content.scripting, projectDetails);
|
|
const collectionContext = utilities.createContext(content.functions, scripting.language);
|
|
const categories = content.actions.map(
|
|
(action) => utilities.parseCategory(action, collectionContext),
|
|
);
|
|
const os = utilities.osParser.parseEnum(content.os, 'os');
|
|
const collection = utilities.createCategoryCollection({
|
|
os, actions: categories, scripting,
|
|
});
|
|
return collection;
|
|
};
|
|
|
|
export type CategoryCollectionFactory = (
|
|
...parameters: ConstructorParameters<typeof CategoryCollection>
|
|
) => ICategoryCollection;
|
|
|
|
export interface CategoryCollectionParser {
|
|
(
|
|
content: CollectionData,
|
|
projectDetails: ProjectDetails,
|
|
utilities?: CategoryCollectionParserUtilities,
|
|
): ICategoryCollection;
|
|
}
|
|
|
|
function validateCollection(
|
|
content: CollectionData,
|
|
validator: TypeValidator,
|
|
): void {
|
|
validator.assertObject({
|
|
value: content,
|
|
valueName: 'Collection',
|
|
allowedProperties: [
|
|
'os', 'scripting', 'actions', 'functions',
|
|
],
|
|
});
|
|
validator.assertNonEmptyCollection({
|
|
value: content.actions,
|
|
valueName: '\'actions\' in collection',
|
|
});
|
|
}
|
|
|
|
interface CategoryCollectionParserUtilities {
|
|
readonly osParser: EnumParser<OperatingSystem>;
|
|
readonly validator: TypeValidator;
|
|
readonly parseScriptingDefinition: ScriptingDefinitionParser;
|
|
readonly createContext: CategoryCollectionContextFactory;
|
|
readonly parseCategory: CategoryParser;
|
|
readonly createCategoryCollection: CategoryCollectionFactory;
|
|
}
|
|
|
|
const DefaultUtilities: CategoryCollectionParserUtilities = {
|
|
osParser: createEnumParser(OperatingSystem),
|
|
validator: createTypeValidator(),
|
|
parseScriptingDefinition,
|
|
createContext: createCategoryCollectionContext,
|
|
parseCategory,
|
|
createCategoryCollection: (...args) => new CategoryCollection(...args),
|
|
};
|