summaryrefslogtreecommitdiffhomepage
path: root/vhosts/blog/nuldoc-src/slide/parse.ts
blob: 7ba17cb0d1d0a39fb0c83b88e1b29c021faf7300 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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 {
    const root = SlideMetadataSchema.parse(
      parseToml(await Deno.readTextFile(filePath)),
    );
    return createNewSlideFromTomlRootObject(root, filePath, config);
  } catch (e) {
    if (e instanceof Error) {
      e.message = `${e.message} in ${filePath}`;
    }
    throw e;
  }
}