import { showValue } from '..'; import { expected, success } from '../result'; import { create, Codec } from '../runtype'; import { parenthesize } from '../show'; export interface KeyOf extends Codec { readonly tag: 'keyOf'; readonly keys: Set; } export function KeyOf(object: TObject): KeyOf { const keys = new Set(Object.keys(object)); const name = [...keys] .sort() .map(k => showValue(k)) .join(` | `); return create>( 'keyOf', value => keys.has(typeof value === 'number' ? value.toString() : (value as any)) ? success(value as any) : expected(name, value), { keys, show: needsParens => parenthesize(name, needsParens), }, ); }