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