1 # bolt: a linter, checker and language server for Bend 2. 2 # 3 # The one binary. Shake parses the line: `lint`, or a word that is no 4 # subcommand, or nothing, lints the files named after it (every `.bend` file 5 # under the current directory when none are); `check` runs the checker on 6 # them; `lsp` serves an editor over stdio; `help` (or `--help`) prints usage; `--version` 7 # prints the release and the short commit when the build has one. Build it 8 # native (`bend main.bend -o bin/bolt.bin`). `bolt lsp` runs on the cores: 9 # with no runtime `--gpu` it is `+RTS --gpu off -RTS lsp`, and 10 # `+RTS --gpu on -RTS` or `+RTS --gpu 4GB -RTS` asks for the device. Runtime 11 # options go between `+RTS` and `-RTS` (bend 2.0.38); bolt declares no 12 # `--gpu` of its own, so `bolt --gpu off` is an unknown option. What the line 13 # does is Args.out's decision (src/LAWS.bend proves it); this file only does 14 # it, and LAWS.bend states what src/stop.bend's say and leave do. 15 # Everything under src/ is internal. 16 import Base 17 import ./src/args.bend as Args 18 import ./src/lint.bend as Lint 19 import ./src/check.bend as Check 20 import ./src/lsp/run.bend as Lsp 21 import ./src/lsp/checker/bend.bend as BendChecker 22 import ./src/stop.bend as Stop 23 24 # what a subcommand runs, over the files after it 25 def dispatch(cmd: Args.Cmd, paths: List<&2, String>) -> IO(Unit): # noqa: L001 IO driver 26 match cmd: 27 case Args.CLint{}: 28 Lint.run(paths) 29 case Args.CCheck{}: 30 Check.run(~BendChecker.service(), paths) 31 case Args.CLsp{}: 32 Lsp.run() 33 34 # what a parsed line does, done 35 def perform(oo: Args.Out) -> IO(Unit): # noqa: L001 IO driver 36 match oo: 37 case Args.Stop{to, text, code}: 38 do IO: 39 Stop.say(to, text) 40 Stop.leave(code) 41 case Args.Go{cmd, paths}: 42 dispatch(cmd, paths) 43 44 def main() -> IO(Unit): # noqa: L001 IO entry point 45 do IO: 46 +av : List<&2, String> <- Args.argv() 47 perform(Args.out(Args.parse(Args.line(av))))