UNPKG

@lucaspaganini/value-objects

Version:

TypeScript first validation and class creation library

37 lines (32 loc) 1.18 kB
import { Either, isError, left, right } from '../utils' import { ValueObjectContructor, VOCRawInit } from './value-object' export const makeIsValidRawInit = <VOC extends ValueObjectContructor>(VO: VOC) => // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types (v: any): v is VOCRawInit<VOC> => { try { new VO(v) return true } catch { return false } } export const makeFromRawInit = <VOC extends ValueObjectContructor>(VO: VOC) => (data: VOCRawInit<VOC>): Either<Array<Error>, InstanceType<VOC>> => { try { return right(new VO(data) as any) } catch (err) { if (isError(err)) return left([err]) if (err instanceof Array && err.every(isError)) return left(err) return left([Error()]) } } export interface ValueObjectFunctions<VOC extends ValueObjectContructor> { isValidRawInit(v: any): v is VOCRawInit<VOC> fromRawInit(data: VOCRawInit<VOC>): Either<Array<Error>, InstanceType<VOC>> } export const makeFunctions = <VOC extends ValueObjectContructor>(VO: VOC): ValueObjectFunctions<VOC> => ({ isValidRawInit: makeIsValidRawInit(VO), fromRawInit: makeFromRawInit(VO), })