summaryrefslogtreecommitdiffhomepage
path: root/vhosts/blog/nuldoc-src/slide/parse.ts
diff options
context:
space:
mode:
Diffstat (limited to 'vhosts/blog/nuldoc-src/slide/parse.ts')
-rw-r--r--vhosts/blog/nuldoc-src/slide/parse.ts36
1 files changed, 20 insertions, 16 deletions
diff --git a/vhosts/blog/nuldoc-src/slide/parse.ts b/vhosts/blog/nuldoc-src/slide/parse.ts
index 5daa6ed0..82510a95 100644
--- a/vhosts/blog/nuldoc-src/slide/parse.ts
+++ b/vhosts/blog/nuldoc-src/slide/parse.ts
@@ -1,28 +1,32 @@
import { parse as parseToml } from "std/toml/mod.ts";
import { Config } from "../config.ts";
import { createNewSlideFromTomlRootObject, Slide } from "./slide.ts";
+import { z } from "zod/mod.ts";
+
+const SlideMetadataSchema = z.object({
+ slide: z.object({
+ uuid: z.string(),
+ title: z.string(),
+ event: z.string(),
+ talkType: z.string(),
+ link: z.string(),
+ tags: z.array(z.string()),
+ revisions: z.array(z.object({
+ date: z.string(),
+ remark: z.string(),
+ isInternal: z.boolean().optional(),
+ })),
+ }),
+});
export async function parseSlideFile(
filePath: string,
config: Config,
): Promise<Slide> {
try {
- // TODO runtime assertion
- const root = parseToml(await Deno.readTextFile(filePath)) as {
- slide: {
- uuid: string;
- title: string;
- event: string;
- talkType: string;
- link: string;
- tags: string[];
- revisions: {
- date: string;
- remark: string;
- isInternal?: boolean;
- }[];
- };
- };
+ const root = SlideMetadataSchema.parse(
+ parseToml(await Deno.readTextFile(filePath)),
+ );
return createNewSlideFromTomlRootObject(root, filePath, config);
} catch (e) {
e.message = `${e.message} in ${filePath}`;