MCPcopy Create free account
hub / github.com/hydro-dev/Hydro / parseConfig

Function parseConfig

packages/hydrooj/src/lib/testdataConfig.ts:7–40  ·  view source on GitHub ↗
(config: string | ProblemConfigFile = {}, files: string[])

Source from the content-addressed store, hash-verified

5import type { ProblemConfig } from '../interface';
6
7export async function parseConfig(config: string | ProblemConfigFile = {}, files: string[]) {
8 const cfg: ProblemConfigFile = typeof config === 'string'
9 ? await readYamlCases(load(config) as Record<string, any>)
10 : await readYamlCases(config);
11 const result: ProblemConfig = {
12 count: Object.keys(cfg.answers || {}).length || Math.sum((cfg.subtasks || []).map((s) => s.cases.length)),
13 memoryMin: Number.MAX_SAFE_INTEGER,
14 memoryMax: 0,
15 timeMin: Number.MAX_SAFE_INTEGER,
16 timeMax: 0,
17 type: cfg.type || 'default',
18 hackable: cfg.validator && cfg.checker && !['default', 'strict'].includes(cfg.checker_type),
19 };
20 if (cfg.subType) result.subType = cfg.subType;
21 if (cfg.target) result.target = cfg.target;
22 result.count ||= Math.sum(readSubtasksFromFiles(files, cfg).map((i) => i.cases.length));
23 if (cfg.subtasks?.length) {
24 for (const subtask of normalizeSubtasks(cfg.subtasks as any || [], (i) => i, cfg.time, cfg.memory)) {
25 result.memoryMax = Math.max(result.memoryMax, ...subtask.cases.map((i) => parseMemoryMB(i.memory)));
26 result.memoryMin = Math.min(result.memoryMin, ...subtask.cases.map((i) => parseMemoryMB(i.memory)));
27 result.timeMax = Math.max(result.timeMax, ...subtask.cases.map((i) => parseTimeMS(i.time)));
28 result.timeMin = Math.min(result.timeMin, ...subtask.cases.map((i) => parseTimeMS(i.time)));
29 }
30 } else {
31 if (cfg.time) result.timeMax = result.timeMin = cfg.time as unknown as number;
32 if (cfg.memory) result.memoryMax = result.memoryMin = cfg.memory as unknown as number;
33 }
34 if (result.memoryMax < result.memoryMin) result.memoryMax = result.memoryMin = 256;
35 if (result.timeMax < result.timeMin) result.timeMax = result.timeMin = 1000;
36 if (cfg.langs) result.langs = cfg.langs;
37 if (cfg.redirect) result.redirect = cfg.redirect.split('/', 2) as any;
38 if (cfg.filename && result.type === 'default') result.subType = cfg.filename;
39 return result;
40}

Callers 2

getMethod · 0.90
getListMethod · 0.90

Calls 6

readYamlCasesFunction · 0.90
readSubtasksFromFilesFunction · 0.90
normalizeSubtasksFunction · 0.90
parseMemoryMBFunction · 0.90
parseTimeMSFunction · 0.90
loadFunction · 0.50

Tested by

no test coverage detected