export * from './binary'; export * from './unary'; import { nameOf } from '../reflection/nameof'; import { Integer, isInteger, isNegativeInteger, isNegativeNumber, isNonNegativeInteger, isNonNegativeNumber, isNonPositiveInteger, isNonPositiveNumber, isNumber, isPositiveInteger, isPositiveNumber, NegativeInteger, NegativeNumber, NonNegativeInteger, NonNegativeNumber, NonPositiveInteger, NonPositiveNumber, NumberOrString, PositiveInteger, PositiveNumber } from '../number'; import { AbsoluteUrl, EmailAddress, Guid, isAbsoluteUrl, isEmailAddress, isGuid, isLowerCase, isString, isUpperCase, LowerCase, UpperCase } from '../string'; import { isArray, isBoolean, isNaN, isNil, isNull, isNumberOrString } from './unary'; import { Nil } from '../maybe'; type GlobalDomainName = keyof GlobalDomainRuleMap; interface GlobalDomainRule { name: GlobalDomainName; test: (val: unknown) => val is T; } class GlobalDomainRuleMap { AbsoluteUrl: GlobalDomainRule = { test: isAbsoluteUrl, name: nameOf((o) => o.AbsoluteUrl), }; Array: GlobalDomainRule = {test: isArray, name: nameOf((o) => o.Array)}; Boolean: GlobalDomainRule = {test: isBoolean, name: nameOf((o) => o.Boolean)}; EmailAddress: GlobalDomainRule = {test: isEmailAddress, name: nameOf((o) => o.EmailAddress)}; Guid: GlobalDomainRule = {test: isGuid, name: nameOf((o) => o.Guid)}; Intenger: GlobalDomainRule = {test: isInteger, name: nameOf((o) => o.Intenger)}; LowerCase: GlobalDomainRule = {test: isLowerCase, name: nameOf((o) => o.LowerCase)}; NaN: GlobalDomainRule = {test: isNaN, name: nameOf((o) => o.NaN)}; NegativeInteger: GlobalDomainRule = { test: isNegativeInteger, name: nameOf((o) => o.NegativeInteger), }; NegativeNumber: GlobalDomainRule = { test: isNegativeNumber, name: nameOf((o) => o.NegativeNumber), }; Nil: GlobalDomainRule = {test: isNil, name: nameOf((o) => o.Nil)}; NonNevativeInteger: GlobalDomainRule = { test: isNonNegativeInteger, name: nameOf((o) => o.NonNevativeInteger), }; NonNevativeNumber: GlobalDomainRule = { test: isNonNegativeNumber, name: nameOf((o) => o.NonNevativeNumber), }; NonPositiveInteger: GlobalDomainRule = { test: isNonPositiveInteger, name: nameOf((o) => o.NonPositiveInteger), }; NonPositiveNumber: GlobalDomainRule = { test: isNonPositiveNumber, name: nameOf((o) => o.NonPositiveNumber), }; Null: GlobalDomainRule = {test: isNull, name: nameOf((o) => o.Null)}; Number: GlobalDomainRule = {test: isNumber, name: nameOf((o) => o.Number)}; NumberOrString: GlobalDomainRule = { test: isNumberOrString, name: nameOf((o) => o.NumberOrString), }; PositiveInteger: GlobalDomainRule = { test: isPositiveInteger, name: nameOf((o) => o.PositiveInteger), }; PositiveNumber: GlobalDomainRule = { test: isPositiveNumber, name: nameOf((o) => o.PositiveNumber), }; String: GlobalDomainRule = {test: isString, name: nameOf((o) => o.String)}; UpperCase: GlobalDomainRule = {test: isUpperCase, name: nameOf((o) => o.UpperCase)}; } const _map = Object.freeze(new GlobalDomainRuleMap()); const _keys = Object.freeze(Object.keys(_map).sort()) as readonly GlobalDomainName[]; const _values = Object.freeze(_keys.map((k) => _map[k])); export function ruleFor(ruleFunction: (obj: GlobalDomainRuleMap) => GlobalDomainRule): GlobalDomainRule { throw "Error" // return >_map[nameOf(ruleFunction)]; } /* ruleFor(o => o.AbsoluteUrl); ruleFor((o) => o.AbsoluteUrl); ruleFor((o) => o.String); */ export class GlobalDomain { static has = (key: string): boolean => key in GlobalDomainRuleMap; static test = (name: GlobalDomainName, val: unknown): boolean => _map[name]?.test(val); static map = _map; static all = _values; }