import { Either, isError, left, right } from '../utils' import { ValueObjectContructor, VOCRawInit } from './value-object' export const makeIsValidRawInit = (VO: VOC) => // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types (v: any): v is VOCRawInit => { try { new VO(v) return true } catch { return false } } export const makeFromRawInit = (VO: VOC) => (data: VOCRawInit): Either, InstanceType> => { 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 { isValidRawInit(v: any): v is VOCRawInit fromRawInit(data: VOCRawInit): Either, InstanceType> } export const makeFunctions = (VO: VOC): ValueObjectFunctions => ({ isValidRawInit: makeIsValidRawInit(VO), fromRawInit: makeFromRawInit(VO), })