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