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; }; }