summaryrefslogtreecommitdiffstats
path: root/4lib/tv/default.nix
blob: 6985baa900b78ebce1f4a9624e84b618286429fb (plain)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
{ lib, pkgs, ... }:

with builtins;
with lib;

builtins // lib // rec {

  git = import ./git.nix {
    lib = lib // {
      inherit addNames;
    };
    inherit pkgs;
  };

  addName = name: set:
    set // { inherit name; };

  addNames = mapAttrs addName;


  # "7.4.335" -> "74"
  majmin = with lib; x : concatStrings (take 2 (splitString "." x));


  concat = xs :
    if xs == []
      then ""
      else head xs + concat (tail xs)
    ;

  flip = f : x : y : f y x;

  # isSuffixOf :: String -> String -> Bool
  isSuffixOf =
    s : xs :
      let
        sn = stringLength s;
        xsn = stringLength xs;
      in
        xsn >= sn && substring (xsn - sn) sn xs == s ;

  removeSuffix =
    s : xs : substring 0 (stringLength xs - stringLength s) xs;

  # setMap :: (String -> a -> b) -> Set String a -> [b]
  #setMap = f: xs: map (k : f k (getAttr k xs)) (attrNames xs);

  # setToList :: Set k a -> [a]
  #setToList = setMap (_: v: v);

  shell-escape =
    let
      isSafeChar = c: match "[-./0-9_a-zA-Z]" c != null;
    in
    stringAsChars (c:
      if isSafeChar c then c
      else if c == "\n" then "'\n'"
      else "\\${c}");

  types = lib.types // (with lib.types; rec {

    host = submodule {
      options = {
        name = mkOption {
          type = label;
        };
        dc = mkOption {
          type = label;
        };
        cores = mkOption {
          type = positive;
        };
        nets = mkOption {
          type = attrsOf net;
          apply = x: assert hasAttr "retiolum" x; x;
        };
        search = mkOption {
          type = hostname;
        };
      };
    };

    net = submodule ({ config, ... }: {
      options = {
        addrs = mkOption {
          type = listOf addr;
          apply = _: config.addrs4 ++ config.addrs6;
        };
        addrs4 = mkOption {
          type = listOf addr4;
          default = [];
        };
        addrs6 = mkOption {
          type = listOf addr6;
          default = [];
        };
        aliases = mkOption {
          # TODO nonEmptyListOf hostname
          type = listOf hostname;
        };
      };
    });

    positive = mkOptionType {
      name = "positive integer";
      check = x: isInt x && x > 0;
      merge = mergeOneOption;
    };

    # TODO
    addr = str;
    addr4 = str;
    addr6 = str;
    hostname = str;
    label = str;
  });

}