diff options
Diffstat (limited to 'vhosts/blog/nuldoc-src/slide/parse.ts')
| -rw-r--r-- | vhosts/blog/nuldoc-src/slide/parse.ts | 36 |
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}`; |
