import type { CategoryData, ScriptData, CategoryOrScriptData, } from '@/application/collections/'; import { Script } from '@/domain/Script'; import { Category } from '@/domain/Category'; import { wrapErrorWithAdditionalContext, type ErrorWithContextWrapper } from '@/application/Parser/ContextualError'; import type { ICategory } from '@/domain/ICategory'; import { parseDocs, type DocsParser } from './DocumentationParser'; import { parseScript, type ScriptParser } from './Script/ScriptParser'; import { createNodeDataValidator, type NodeDataValidator, type NodeDataValidatorFactory } from './NodeValidation/NodeDataValidator'; import { NodeDataType } from './NodeValidation/NodeDataType'; import type { ICategoryCollectionParseContext } from './Script/ICategoryCollectionParseContext'; let categoryIdCounter = 0; export function parseCategory( category: CategoryData, context: ICategoryCollectionParseContext, utilities: CategoryParserUtilities = DefaultCategoryParserUtilities, ): Category { return parseCategoryRecursively({ categoryData: category, context, utilities, }); } interface CategoryParseContext { readonly categoryData: CategoryData; readonly context: ICategoryCollectionParseContext; readonly parentCategory?: CategoryData; readonly utilities: CategoryParserUtilities; } function parseCategoryRecursively( context: CategoryParseContext, ): Category | never { const validator = ensureValidCategory(context); const children: CategoryChildren = { subcategories: new Array(), subscripts: new Array