//
//
//
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;
}