1 import Base
2 import ../../../../../general/markup/type.bend as M
3 import ../../../../../general/markup/ops.bend as MO
4 import ../nix_darwin/type.bend as ND
5 import ./type.bend as L
6
7 # A launch agent's property list, written as XML through markup.
8
9 def key(+k: String) -> M.Node:
10 M.Element{"key", [], [M.Text{k}]}
11
12 def str(+s: String) -> M.Node:
13 M.Element{"string", [], [M.Text{s}]}
14
15 def strs(xs: List<&2, String>) -> List<&2, M.Node>:
16 match xs:
17 case []:
18 []
19 case x <> rest:
20 str(x) <> strs(rest)
21
22 def vars(vs: List<&2, L.Variable>) -> List<&2, M.Node>:
23 match vs:
24 case []:
25 []
26 case L.Variable{k, v} <> rest:
27 key(k) <> str(v) <> vars(rest)
28
29 def path(+home: String, +label: String) -> String:
30 home ++ "/Library/LaunchAgents/" ++ label ++ ".plist"
31
32 def plist(+home: String, a: L.Agent) -> String:
33 match a:
34 case L.Agent{_, label, command, args, env, +log, _}:
35 "\n" ++
36 "\n" ++
37 MO.print([M.Element{"plist", [M.Attribute{"version", "1.0"}], [M.Element{"dict", [], [
38 key("Label"), str(label),
39 key("ProgramArguments"), M.Element{"array", [], str(command) <> strs(args)},
40 key("EnvironmentVariables"), M.Element{"dict", [], vars(env)},
41 key("RunAtLoad"), M.Raw{""},
42 key("KeepAlive"), M.Raw{""},
43 key("StandardOutPath"), str(home ++ "/Library/Logs/" ++ log ++ ".log"),
44 key("StandardErrorPath"), str(home ++ "/Library/Logs/" ++ log ++ ".log")]}]}]) ++ "\n"
45
46 def label_of(a: L.Agent) -> String:
47 match a:
48 case L.Agent{_, label, _, _, _, _, _}:
49 label
50
51 def programs(ld: L.Launchd) -> List<&2, L.Program>:
52 match ld:
53 case L.Launchd{xs, _, _}:
54 xs
55
56 def agents(ld: L.Launchd) -> List<&2, L.Agent>:
57 match ld:
58 case L.Launchd{_, xs, _}:
59 xs
60
61 def serves(ld: L.Launchd) -> List<&2, ND.Serve>:
62 match ld:
63 case L.Launchd{_, _, xs}:
64 xs
65
66 def port_of(a: L.Agent) -> U32:
67 match a:
68 case L.Agent{_, _, _, _, _, _, p}:
69 p
70
71 def ports(xs: List<&2, L.Agent>) -> List<&2, U32>:
72 match xs:
73 case []:
74 []
75 case a <> rest:
76 port_of(a) <> ports(rest)