 efdf618330
			
		
	
	
		efdf618330
		
	
	
	
	
		
			
			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}";
 | |
| 
 | |
| }
 |