forbid traps from being nullable

This commit is contained in:
Emile Clark-Boman 2026-01-28 15:39:41 +10:00
parent c135b7222b
commit c000ede9f7

View file

@ -7,14 +7,17 @@
inherit inherit
(this.std) (this.std)
enfAllAttrs
enfHasAttr enfHasAttr
; ;
inherit inherit
(this.std.maybe) (this.std.maybe)
Some nullableToMaybe
None
; ;
enfNoNullTraps = decl: msg:
enfAllAttrs (_: value: value != null) decl.unlock "decl.unlock" "be null" msg;
in rec { in rec {
masterkey = "_''traps''_"; masterkey = "_''traps''_";
defaultTrapdoorKey = "_'"; defaultTrapdoorKey = "_'";
@ -23,6 +26,7 @@ in rec {
mkTrapdoorFn = decl: mkTrapdoorFn = decl:
assert enfHasAttr "default" decl "mkTrapdoorFn"; assert enfHasAttr "default" decl "mkTrapdoorFn";
assert enfHasAttr "unlock" decl "mkTrapdoorFn"; assert enfHasAttr "unlock" decl "mkTrapdoorFn";
assert enfNoNullTraps decl "mkTrapdoorFn";
# return trapdoor function # return trapdoor function
(x: (x:
if x == masterkey if x == masterkey
@ -32,6 +36,7 @@ in rec {
mkTrapdoorSet = decl: mkTrapdoorSet = decl:
assert enfHasAttr "default" decl "mkTrapdoorSet"; assert enfHasAttr "default" decl "mkTrapdoorSet";
assert enfHasAttr "unlock" decl "mkTrapdoorSet"; assert enfHasAttr "unlock" decl "mkTrapdoorSet";
assert enfNoNullTraps decl "mkTrapdoorFn";
# return trapdoor set # return trapdoor set
decl.default decl.default
// { // {
@ -40,34 +45,19 @@ in rec {
isTrapdoorFnKey = key: T: isFunction T && (T masterkey) ? ${key}; isTrapdoorFnKey = key: T: isFunction T && (T masterkey) ? ${key};
isTrapdoorSetKey = key: T: isTrapdoorSetKey = key: T: T ? ${masterkey}.${key};
if T ? ${masterkey}
then T.${masterkey} ? ${key}
else false;
isTrapdoorKey = key: T: isTrapdoorKey = key: T:
if isAttrs T if isAttrs T
then isTrapdoorSetKey key T then isTrapdoorSetKey key T
else isTrapdoorFnKey key T; else isTrapdoorFnKey key T;
openTrapdoorFn = key: T: let
unlock = T masterkey;
in
if isFunction T && unlock ? ${key}
then Some unlock.${key}
else None;
openTrapdoorSet = key: T: let
unlock = T.${masterkey};
in
if T ? ${masterkey} && unlock ? ${key}
then Some unlock.${key}
else None;
openTrapdoor = key: T: openTrapdoor = key: T:
if isFunction T nullableToMaybe (
then openTrapdoorFn key T if isFunction T
else if isAttrs T then (T masterkey).${key} or null
then openTrapdoorSet key T else if isAttrs T
else None; then T.${masterkey}.${key} or null
else null
);
} }