85 lines
4.6 KiB
Nix
85 lines
4.6 KiB
Nix
{ extendPath, ... }:
|
|
let
|
|
inherit(builtins) all attrValues dirOf elem false storeDir substring true throw typeOf;
|
|
|
|
maxI8 = maxU8 / 2;
|
|
maxI16 = maxU16 / 2;
|
|
maxI32 = maxU32 / 2;
|
|
|
|
maxU8 = 255;
|
|
maxU16 = 65535;
|
|
maxU32 = 4294967295;
|
|
|
|
minI8 = 0 - maxI8 - 1;
|
|
minI16 = 0 - maxI16 - 1;
|
|
minI32 = 0 - maxI32 - 1;
|
|
|
|
#isCoercibleToPath = x: isCoercibleToString x && isAbsolutePath x;
|
|
#isSetCoercibleToString = x: x ? outPath || x ? __toString;
|
|
#isSetOf = { elemType, ... }: x: isSet x && all elemType.check (attrValues x);
|
|
|
|
implementsToString = { __toString ? null, ... }: __toString != null;
|
|
|
|
isAbsolutePath = x: isInstanceOf [ "String" "Path" ] x && (substring 0 1 x.value) == "/";
|
|
isAny = _: true;
|
|
isBool = isInstanceOf "Bool";
|
|
isDictionary = isInstanceOf "Dictionary";
|
|
isDictionaryOf = { elemType, ... }: x: isDictionary x && all elemType.check (attrValues x.value);
|
|
isDerivation = isInstanceOf "Derivation";
|
|
isFloat = isInstanceOf "Float";
|
|
isFloatBetween = { from, till }: x: isFloat x && x.value >= from && x.value <= till;
|
|
isFunction = isInstanceOf "Function";
|
|
isInList = list: x: elem x list;
|
|
isInstanceOf
|
|
= type:
|
|
{ __type__, ... }:
|
|
{
|
|
list = elem __type__ type;
|
|
string = __type__ == type;
|
|
}.${typeOf type} or (throw "isInstanceOf expects list of strings or a string");
|
|
isInteger = isInstanceOf "Integer";
|
|
isIntegerBetween = { from, till }: x: isInteger x && x.value >= from && x.value <= till;
|
|
isList = isInstanceOf "List";
|
|
isListOf = mightBeEmpty: { elemType, ... }: x: isList x && (x.value != [] || mightBeEmpty) && all elemType.check x.value;
|
|
isNever = _: false;
|
|
isNonEmptyString = x: isString x && match "[ \t\n]*" x.value == null;
|
|
isNonNegativeNumber = x: isNumber x && x.value >= 0;
|
|
isNull = isInstanceOf "Null";
|
|
isNumber = isInstanceOf [ "Float" "Integer" ];
|
|
isNumberBetween = { from, till }: x: isNumber x && x.value >= from && x.value <= till;
|
|
isOptionType = isInstanceOf "OptionType";
|
|
isPackage = x: isDerivation x || isStorePath x;
|
|
isPath = isInstanceOf "Path";
|
|
isPositiveInteger = x: isInteger x && x.value > 0;
|
|
isPositiveNumber = x: isNumber x && x.value > 0;
|
|
isSignedByte = x: isInteger x && x.value >= minI8 && x.value <= maxI8;
|
|
isSignedLong = x: isInteger x && x.value >= minI32 && x.value <= maxI32;
|
|
isSignedWord = x: isInteger x && x.value >= minI16 && x.value <= maxI16;
|
|
isStorePath
|
|
= x:
|
|
if !(isList x)
|
|
&& implementsToString x
|
|
then
|
|
let
|
|
x' = toString x;
|
|
in
|
|
isAbsolutePath x' && dirOf x' == storeDir
|
|
else
|
|
false;
|
|
isString = isInstanceOf "String";
|
|
isStringMatching = regex: x: isString x && (match regex x.value) != null;
|
|
isUnsignedInteger = x: isInteger x && x.value >= 0;
|
|
isUnsignedByte = x: isUnsignedInteger x && x.value <= maxU8;
|
|
isUnsignedLong = x: isUnsignedInteger x && x.value <= maxU32;
|
|
isUnsignedWord = x: isUnsignedInteger x && x.value <= maxU16;
|
|
in
|
|
{
|
|
inherit implementsToString;
|
|
inherit isAbsolutePath isAny isBool isDictionary isDictionaryOf isDerivation isFloat
|
|
isFloatBetween isFunction isInList isInstanceOf isInteger isIntegerBetween isList
|
|
isListOf isNever isNonEmptyString isNonNegativeNumber isNull isNumber isNumberBetween
|
|
isOptionType isPackage isPath isPositiveInteger isPositiveNumber isSignedByte
|
|
isSignedLong isSignedWord isStorePath isString isStringMatching isUnsignedInteger
|
|
isUnsignedByte isUnsignedLong isUnsignedWord;
|
|
};
|