touchdesigner-mcp-server
Version:
MCP server for TouchDesigner
79 lines (78 loc) • 2.96 kB
JavaScript
import { ZodError } from "zod";
import { createErrorResult, createSuccessResult } from "../core/result.js";
import { TransportConfigSchema } from "./config.js";
/**
* Transport configuration validator using Zod schemas
*/
export class TransportConfigValidator {
/**
* Validate a transport configuration
*
* @param config - The configuration to validate
* @returns Result with validated config or validation errors
*/
static validate(config) {
try {
const validatedConfig = TransportConfigSchema.parse(config);
return createSuccessResult(validatedConfig);
}
catch (error) {
if (error instanceof ZodError) {
const validationErrors = TransportConfigValidator.formatZodErrors(error);
const errorMessage = TransportConfigValidator.buildErrorMessage(validationErrors);
return createErrorResult(new Error(errorMessage));
}
// Unexpected error
const err = error instanceof Error ? error : new Error(String(error));
return createErrorResult(new Error(`Transport configuration validation failed: ${err.message}`));
}
}
/**
* Format Zod validation errors into structured ValidationError objects
*
* @param zodError - The Zod validation error
* @returns Array of structured validation errors
*/
static formatZodErrors(zodError) {
return zodError.issues.map((err) => ({
field: err.path.join("."),
message: err.message,
}));
}
/**
* Build a comprehensive error message from validation errors
*
* @param errors - Array of validation errors
* @returns Formatted error message
*/
static buildErrorMessage(errors) {
const errorLines = errors.map((err) => {
if (err.field) {
return ` - ${err.field}: ${err.message}`;
}
return ` - ${err.message}`;
});
return `Transport configuration validation failed:\n${errorLines.join("\n")}`;
}
/**
* Validate and merge with defaults for HTTP transport
* This is a convenience method for applying default values after validation
*
* @param config - The configuration to validate
* @returns Result with validated and merged config
*/
static validateAndMergeDefaults(config) {
const validationResult = TransportConfigValidator.validate(config);
if (!validationResult.success) {
return validationResult;
}
// No merging needed for stdio
if (validationResult.data.type === "stdio") {
return validationResult;
}
// Merge defaults for HTTP transport
// Note: Defaults are already defined in config.ts
// This method is here for future extensibility if runtime merging is needed
return validationResult;
}
}