about summary refs log tree commit diff
path: root/users/Profpatsch/netstring/default.nix
blob: 333244a0f7011912618f37f4caa502e3bebd88fb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{ lib, pkgs, depot, ... }:
let
  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.users.Profpatsch.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.utils.drvTargets {
  inherit
    python-netstring
    rust-netstring
      ;
}