import {infer as inferUtil} from '../../util' import {ValidationResult} from './types' /** Attempt to infer the native type of a string value. */ function infer(fieldName: string, inputValue: unknown): ValidationResult { return { valid: true, castValue: typeof inputValue === 'string' ? inferUtil(inputValue) : inputValue, } } /** * Casts the input value to a boolean. * Note that this assumes the value may be boolish. The strings "true", "True", * "TRUE", and "1" evaluate to `true`, while "false", "False", "FALSE", and "0" * evaluate to `false`. * @param fieldName * @param inputValue */ function boolean(fieldName: string, inputValue: unknown): ValidationResult { let castValue = Boolean(inputValue) if ( ['true', 'True', 'TRUE', '1'].includes(String(inputValue)) ) { castValue = true } if ( ['false', 'False', 'FALSE', '0'].includes(String(inputValue)) ) { castValue = false } return { valid: true, castValue, } } /** Casts the input value to a string. */ function string(fieldName: string, inputValue: unknown): ValidationResult { return { valid: true, castValue: String(inputValue), } } /** Casts the input value to a number, if it is numerical. Fails otherwise. */ function numeric(fieldName: string, inputValue: unknown): ValidationResult { if ( !isNaN(parseFloat(String(inputValue))) ) { return { valid: true, castValue: parseFloat(String(inputValue)), } } return { valid: false, message: 'must be numeric', } } /** Casts the input value to an integer. Fails otherwise. */ function integer(fieldName: string, inputValue: unknown): ValidationResult { if ( !isNaN(parseInt(String(inputValue), 10)) ) { return { valid: true, castValue: parseInt(String(inputValue), 10), } } return { valid: false, message: 'must be an integer', } } export const Cast = { infer, boolean, string, numeric, integer, }