UNPKG

io-ts-extra

Version:

Adds pattern matching, optional properties, and several other helpers and types, to io-ts.

33 lines (30 loc) 1.25 kB
import * as t from 'io-ts' import {inspect} from 'util' import {EOL} from 'os' /** * Similar to io-ts's PathReporter, but gives slightly less verbose output. * @param validation Usually the result of calling `.decode` with an io-ts codec. * @param typeAlias io-ts type names can be verbose. If the type you're using doesn't have a name, * you can use this to keep error messages shorter. */ export const validationErrors = (validation: t.Validation<unknown>, typeAlias?: string) => { if (validation._tag === 'Right') { return ['No errors!'] } return validation.left.map(e => { const name = typeAlias || e.context[0]?.type.name const lastType = e.context.length && e.context[e.context.length - 1].type.name const path = name + e.context.map(c => c.key).join('.') return `Invalid value {${inspect(e.value)}} supplied to ${path}. Expected ${lastType}.` }) } /** * Either returns the `.right` of a io-ts `Validation`, or throws with a report of the validation error. * @see validationErrors */ export const getRightUnsafe = <T>(validation: t.Validation<T>, typeAlias?: string) => { if (validation._tag === 'Right') { return validation.right } throw Error(validationErrors(validation, typeAlias).join(EOL)) }