Since the `assertOneOf` uses `lib.generators`, they are not really trivial anymore and should go into their own library file.
		
			
				
	
	
		
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ lib }:
 | 
						|
 | 
						|
rec {
 | 
						|
 | 
						|
  /* Print a trace message if pred is false.
 | 
						|
     Intended to be used to augment asserts with helpful error messages.
 | 
						|
 | 
						|
     Example:
 | 
						|
       assertMsg false "nope"
 | 
						|
       => false
 | 
						|
       stderr> trace: nope
 | 
						|
 | 
						|
       assert (assertMsg ("foo" == "bar") "foo is not bar, silly"); ""
 | 
						|
       stderr> trace: foo is not bar, silly
 | 
						|
       stderr> assert failed at …
 | 
						|
 | 
						|
     Type:
 | 
						|
       assertMsg :: Bool -> String -> Bool
 | 
						|
  */
 | 
						|
  # TODO(Profpatsch): add tests that check stderr
 | 
						|
  assertMsg = pred: msg:
 | 
						|
    if pred
 | 
						|
    then true
 | 
						|
    else builtins.trace msg false;
 | 
						|
 | 
						|
  /* Specialized `assertMsg` for checking if val is one of the elements
 | 
						|
     of a list. Useful for checking enums.
 | 
						|
 | 
						|
     Example:
 | 
						|
       let sslLibrary = "libressl"
 | 
						|
       in assertOneOf "sslLibrary" sslLibrary [ "openssl" "bearssl" ]
 | 
						|
       => false
 | 
						|
       stderr> trace: sslLibrary must be one of "openssl", "bearssl", but is: "libressl"
 | 
						|
 | 
						|
     Type:
 | 
						|
       assertOneOf :: String -> ComparableVal -> List ComparableVal -> Bool
 | 
						|
  */
 | 
						|
  assertOneOf = name: val: xs: assertMsg
 | 
						|
    (lib.elem val xs)
 | 
						|
    "${name} must be one of ${
 | 
						|
      lib.generators.toPretty {} xs}, but is: ${
 | 
						|
        lib.generators.toPretty {} val}";
 | 
						|
 | 
						|
}
 |