src/ez/start.bend
ezx@1.11.0.0 · 109 lines · 14 definitions
1
2
3
4
5
6
7
8import Base
9import ezx@1.11.0.0/src/ledger/manifest.bend as M
10import ezx@1.11.0.0/src/share/args.bend as Args
11
12
13
14type Ask is Data:
15 Check{}
16 Build{out: String}
17 Run{as: List<&2, String>}
18
19
20
21type Start is Data:
22 Refused{why: String}
23 Starts{line: List<&2, String>}
24
25
26def does(ask: Ask) -> String:
27 match ask:
28 case Check{}:
29 "ez check checks a project's entry"
30 case Build{_out}:
31 "ez build builds a project's entry"
32 case Run{_as}:
33 "ez run runs a project's entry"
34
35
36def none(ask: Ask) -> String:
37 "ez: no ez.toml here; " ++ does(ask) ++ ", and ez init makes one"
38
39
40def entry.or(+file: String) -> String:
41 Bool.pick(String, String.is_empty(file), "main.bend", file)
42
43
44def entry(ledger: M.Manifest) -> String:
45 M.Manifest{_n, e, _b, _h, _pa, _pv, _ds, _ts} = ledger
46 entry.or(e)
47
48
49def named(ledger: M.Manifest) -> String:
50 M.Manifest{n, _e, _b, _h, _pa, _pv, _ds, _ts} = ledger
51 n
52
53
54
55
56
57def build.named(+name: String) -> String:
58 "bin/" ++ name ++ ".out"
59
60
61def build.out(+at: String, +name: String) -> String:
62 Bool.pick(String, String.is_empty(at), build.named(name), at)
63
64
65
66
67def line(ask: Ask, +ledger: M.Manifest) -> List<&2, String>:
68 match ask:
69 case Check{}:
70 ["bend", entry(ledger), "-o", ".ez/check.js"]
71 case Build{+out}:
72 ["bend", entry(ledger), "-o", build.out(out, named(ledger))]
73 case Run{as}:
74 Args.run.line(entry(ledger), as)
75
76
77def read(+ask: Ask, ledger: M.Read) -> Start:
78 match ledger:
79 case M.Bad{why}:
80 Refused{"ez: " ++ M.show(M.Bad{why})}
81 case M.Good{+m}:
82 Starts{line(ask, m)}
83
84
85def start(+ask: Ask, text: Maybe<&2, String>) -> Start:
86 match text:
87 case None{}:
88 Refused{none(ask)}
89 case Some{t}:
90 read(ask, M.parse(t))
91
92
93
94
95
96def code(start: Start, program: U32) -> U32:
97 match start:
98 case Refused{_why}:
99 1
100 case Starts{_line}:
101 program
102
103
104def why(start: Start) -> String:
105 match start:
106 case Refused{w}:
107 w
108 case Starts{_line}:
109 ""