Apparently I had forgotten that these already exist on the toplevel. At one point I should unify the two namespaces, but for now at least acknowledge that they are the same functions. Change-Id: Ie7d14de0b65f6c750d97630798c65f777b3eda8c Reviewed-on: https://cl.tvl.fyi/c/depot/+/7673 Reviewed-by: Profpatsch <mail@profpatsch.de> Autosubmit: Profpatsch <mail@profpatsch.de> Tested-by: BuildkiteCI
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { lib, pkgs, depot, ... }:
 | |
| let
 | |
|   toNetstring = depot.nix.netstring.fromString;
 | |
| 
 | |
|   toNetstringList = xs:
 | |
|     lib.concatStrings (map toNetstring xs);
 | |
| 
 | |
|   toNetstringKeyVal = depot.nix.netstring.attrsToKeyValList;
 | |
| 
 | |
|   python-netstring = depot.users.Profpatsch.writers.python3Lib
 | |
|     {
 | |
|       name = "netstring";
 | |
|     } ''
 | |
|     def read_netstring(bytes):
 | |
|         (int_length, rest) = bytes.split(sep=b':', maxsplit=1)
 | |
|         val = rest[:int(int_length)]
 | |
|         # has to end on a ,
 | |
|         assert(rest[len(val)] == ord(','))
 | |
|         return (val, rest[len(val) + 1:])
 | |
| 
 | |
|     def read_netstring_key_val(bytes):
 | |
|         (keyvalnet, rest) = read_netstring(bytes)
 | |
|         (key, valnet) = read_netstring(keyvalnet)
 | |
|         (val, nothing) = read_netstring(valnet)
 | |
|         assert(nothing == b"")
 | |
|         return (key, val, rest)
 | |
| 
 | |
|     def read_netstring_key_val_list(bytes):
 | |
|         rest = bytes
 | |
|         res = {}
 | |
|         while rest != b"":
 | |
|             (key, val, r) = read_netstring_key_val(rest)
 | |
|             rest = r
 | |
|             res[key] = val
 | |
|         return res
 | |
|   '';
 | |
| 
 | |
|   rust-netstring = depot.nix.writers.rustSimpleLib
 | |
|     {
 | |
|       name = "netstring";
 | |
|     } ''
 | |
|     pub fn to_netstring(s: &[u8]) -> Vec<u8> {
 | |
|         let len = s.len();
 | |
|         // length of the integer as ascii
 | |
|         let i_len = ((len as f64).log10() as usize) + 1;
 | |
|         let ns_len = i_len + 1 + len + 1;
 | |
|         let mut res = Vec::with_capacity(ns_len);
 | |
|         res.extend_from_slice(format!("{}:", len).as_bytes());
 | |
|         res.extend_from_slice(s);
 | |
|         res.push(b',');
 | |
|         res
 | |
|     }
 | |
|   '';
 | |
| 
 | |
| in
 | |
| depot.nix.readTree.drvTargets {
 | |
|   inherit
 | |
|     toNetstring
 | |
|     toNetstringList
 | |
|     toNetstringKeyVal
 | |
|     python-netstring
 | |
|     rust-netstring
 | |
|     ;
 | |
| }
 |