// // // import { nameOf } from "./reflection/nameof"; import { isArray } from "./array"; import { isBoolean } from "./boolean"; import { Nil } from './maybe'; import { Integer, isInteger, isNaN, isNegativeInteger, isNegativeNumber, isNonNegativeInteger, isNonNegativeNumber, isNonPositiveInteger, isNonPositiveNumber, isNumber, isNumberOrString, isPositiveInteger, isPositiveNumber, NaN, NegativeInteger, NegativeNumber, NonNegativeInteger, NonNegativeNumber, NonPositiveInteger, NonPositiveNumber, NumberOrString, PositiveInteger, PositiveNumber, } from "./number"; import { isNil, isNull } from "./maybe"; import { AbsoluteUrl, EmailAddress, Guid, isAbsoluteUrl, isEmailAddress, isGuid, isLowerCase, isString, isUpperCase, LowerCase, UpperCase, } from "./string"; 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 "Not implemented"; // 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; }