UNPKG

@samchon/openapi

Version:

OpenAPI definitions and converters for 'typia' and 'nestia'.

75 lines (71 loc) 2.09 kB
import { OpenApi } from "../OpenApi"; import { IValidation } from "../structures/IValidation"; import { OpenApiStationValidator } from "./internal/OpenApiStationValidator"; export namespace OpenApiValidator { export const create = (prop: { components: OpenApi.IComponents; schema: OpenApi.IJsonSchema; required: boolean; equals?: boolean; }) => (value: unknown): IValidation<unknown> => validate({ ...prop, value }); export const validate = (props: { components: OpenApi.IComponents; schema: OpenApi.IJsonSchema; value: unknown; required: boolean; equals?: boolean; }): IValidation<unknown> => { const errors: IValidation.IError[] = []; OpenApiStationValidator.validate({ ...props, path: "$input", exceptionable: true, report: createReporter(errors), equals: props.equals ?? false, }); return errors.length === 0 ? { success: true, data: props.value, } : { success: false, data: props.value, errors, }; }; const createReporter = (array: IValidation.IError[]) => { const reportable = (path: string): boolean => { if (array.length === 0) return true; const last: string = array[array.length - 1]!.path; return ( path.length > last.length || last.substring(0, path.length) !== path ); }; return ( error: IValidation.IError & { exceptionable: boolean; }, ): false => { if (error.exceptionable && reportable(error.path)) { const info: IValidation.IError = { path: error.path, expected: error.expected, value: error.value, description: error.description, }; if (error.value === undefined) info.description ??= [ "The value at this path is `undefined`.", "", `Please fill the \`${error.expected}\` typed value next time.`, ].join("\n"); array.push(info); } return false; }; }; }