import { z } from "https://deno.land/x/zod@v3.22.4/mod.ts"; import { ParserOutput } from "../utils.ts"; export type MsgToServer = ParserOutput; export function message_to_server_parser() { return ping_parser() .or(request_display_parser()) .or(input_parser()) .or(exit_parser()); } export type MsgPing = ParserOutput; export function ping_parser() { return z.object({ kind: z.literal("ping"), content: z.object({ message: z.string(), }), }); } export type MsgReqDisplay = ParserOutput; export function request_display_parser() { return z.object({ kind: z.literal("request_display"), content: z.object({ width: z.number(), height: z.number(), }), }); } export type MsgInput = ParserOutput; export function input_parser() { return z.object({ kind: z.literal("input"), content: z.object({ control: control_parser(), }), }); } export type ClientInput = ParserOutput; function control_parser() { return z.literal("up") .or(z.literal("down")) .or(z.literal("left")) .or(z.literal("right")) .or(z.literal("interact")) .or(z.literal("attack")); } export type MsgExit = ParserOutput; export function exit_parser() { return z.object({ kind: z.literal("exit"), }); }