// Copyright (c) 2026 Antmicro // // SPDX-License-Identifier: Apache-2.0 import { z, ZodRawShape } from 'zod'; import * as semver from 'semver'; export const BaseResponse = z.object({ status: z.string(), version: z.string().refine(s => semver.valid(s) != null), }); export const OkResponse = BaseResponse.extend({ id: z.number(), status: z.literal('success'), data: z.any(), }); export type OkResponse = z.infer; export const ErrorResponse = BaseResponse.extend({ status: z.literal('failure'), error: z .string() .nullish() .transform(err => err ?? 'Unknown error'), }); export type ErrorResponse = z.infer; export const Response = OkResponse.or(ErrorResponse); export type Response = z.infer; function resp(obj: T) { return OkResponse.extend(obj).or(ErrorResponse); } export const SpawnResponse = resp({ data: z.object({}), }); export type SpawnResponse = z.infer; export const KillResponse = resp({ data: z.object({}), }); export type KillResponse = z.infer; export const ExecMonitorResponse = resp({}); export type ExecMonitorResponse = z.infer; export const GetUartsResponse = resp({ data: z.string().array(), }); export const GetButtonsResponse = resp({ data: z.string().array(), }); export const GetLedsResponse = resp({ data: z.string().array(), }); export type GetUartsResponse = z.infer; export const GetMachinesResponse = resp({ data: z.string().array(), }); export type GetMachinesResponse = z.infer; export const GetSensorsResponse = resp({ data: z .object({ name: z.string(), types: z.string().array(), }) .array(), }); export type GetSensorsResponse = z.infer; export const GetSensorResponse = resp({ data: z.unknown(), }); export type GetSensorResponse = z.infer; export const EmptyExecResponse = resp({ data: z.literal('ok'), }); export type EmptyExecResponse = z.infer; export const FsListResponse = resp({ data: z .object({ name: z.string(), isfile: z.boolean(), islink: z.boolean(), }) .array(), }); export type FsListResponse = z.infer; export const FsStatResponse = resp({ data: z.object({ size: z.number(), isfile: z.boolean(), ctime: z.number(), mtime: z.number(), }), }); export type FsStatResponse = z.infer; export const FsDwnlResponse = resp({ data: z.string().base64(), }); export type FsDwnlResponse = z.infer; export const FsUpldResponse = resp({ data: z.object({ path: z.string(), }), }); export type FsUpldResponse = z.infer; export const FsRemoveResponse = resp({ data: z.object({ path: z.string(), }), }); export type FsRemoveResponse = z.infer; export const FsMkdirResponse = resp({ data: z.object({}), }); export type FsMkdirResponse = z.infer; export const FsZipResponse = resp({ data: z.object({ path: z.string(), }), }); export type FsZipResponse = z.infer; export const FsFetchResponse = resp({ data: z.object({ path: z.string(), }), }); export type FsFetchResponse = z.infer; export const FsMoveResponse = resp({ data: z.object({ from: z.string(), to: z.string(), }), }); export type FsMoveResponse = z.infer; export const FsCopyResponse = resp({ data: z.object({ from: z.string(), to: z.string(), }), }); export type FsCopyResponse = z.infer; export const ReplaceAnalyzersResponse = resp({ data: z.object({}), }); export type ReplaceAnalyzersResponse = z.infer; export const FilterEventsResponse = resp({ data: z.object({}), }); export type FilterEventsResponse = z.infer;