import { IValidator, isAsyncValidator, createAsyncValidator, IMaybeError, ValidatorContext } from '../validate'; import { of, from } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { markForRequired, isRequiredValidator } from '../validators'; function withMessage( maybeError: IMaybeError, messagenerator: (ctx: ValidatorContext) => string, ctx: ValidatorContext, ) { return maybeError && { ...maybeError, message: messagenerator(ctx) }; } /** * 为校验错误设定动态的message * @param messagenerator */ export function message(messagenerator: (ctx: ValidatorContext) => string) { return (validator: IValidator) => { const next: IValidator = isAsyncValidator(validator) ? createAsyncValidator((value, context) => { const result = validator.validator(value, context); return ( result && from(result).pipe(switchMap(maybeError => of(withMessage(maybeError, messagenerator, context)))) ); }) : (value: V, context: ValidatorContext) => { return withMessage(validator(value, context), messagenerator, context); }; isRequiredValidator(validator) && markForRequired(next); return next; }; }