import { readFileSync } from 'fs'; import { load } from 'js-toml'; import z from 'zod'; import { ChallengeAlgorithm, ChallengeStrategy } from "@impost/lib"; const SHA256Schema = z.discriminatedUnion("strategy", [ z.object({ algorithm: z.literal(ChallengeAlgorithm.SHA256), strategy: z.literal(ChallengeStrategy.LeadingZeroes), leading_zeroes: z.object({ difficulty: z.number().int().min(1).max(64), }), }), z.object({ algorithm: z.literal(ChallengeAlgorithm.SHA256), strategy: z.literal(ChallengeStrategy.TargetNumber), target_number: z.object({ max_number: z.number().int().min(1).max(100_000), }), }), ]); const Argon2idSchema = z.discriminatedUnion("strategy", [ z.object({ algorithm: z.literal(ChallengeAlgorithm.Argon2id), strategy: z.literal(ChallengeStrategy.LeadingZeroes), leading_zeroes: z.object({ difficulty: z.number().int().min(1).max(64), }), }), z.object({ algorithm: z.literal(ChallengeAlgorithm.Argon2id), strategy: z.literal(ChallengeStrategy.TargetNumber), target_number: z.object({ max_number: z.number().int().min(1).max(100_000), }), }), ]); const KCTFSchema = z.object({ algorithm: z.literal(ChallengeAlgorithm.kCTF), kctf: z.object({ difficulty: z.number().int().min(1), }), }); export const Config = z.union([SHA256Schema, Argon2idSchema, KCTFSchema]); export type Config = z.infer; export let config: Config; try { config = Config.parse(load(readFileSync('./config.toml', 'utf-8'))); } catch (error: any) { if (error instanceof z.ZodError) { console.error("Failed to parse config:"); for (const issue of error.issues) { console.error(issue.message, issue.path); } } else { console.error("Failed to parse config:", error); } process.exit(1); }