66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
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 Argon2Schema = z.discriminatedUnion("strategy", [
|
|
z.object({
|
|
algorithm: z.literal(ChallengeAlgorithm.Argon2),
|
|
strategy: z.literal(ChallengeStrategy.LeadingZeroes),
|
|
leading_zeroes: z.object({
|
|
difficulty: z.number().int().min(1).max(64),
|
|
}),
|
|
}),
|
|
z.object({
|
|
algorithm: z.literal(ChallengeAlgorithm.Argon2),
|
|
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, Argon2Schema, KCTFSchema]);
|
|
|
|
export type Config = z.infer<typeof Config>;
|
|
|
|
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);
|
|
}
|