By: Tom Sydney Kerckhove <syd@cs-syd.eu>
hopinion: check a repository against one rule A tool that reads a repository's Haskell and reports what a rule has to say about it, and a Nix layer that runs it as one check. One rule ships: HsNoCustomShowRead, from haskell-style.md. It is here so that the machinery is exercised by something real rather than by a demonstration. The shape it is built on: A rule says there is something to fix or there is not. There is no third answer, because a checker whose silence can mean "I could not tell" is a checker whose silence means nothing. A module that did not parse is a failure of the run rather than a module with nothing wrong in it, and a module whose source is a preprocessor's input is counted as unread. A rule is a value in a registry rather than an instance of a class: no generic code is polymorphic in a check type, so a record of functions is the right encoding. Adding a rule is a module and a line in a list. Producing a report always succeeds and only judging one fails, so a check that found something still leaves the report where a person can read it. Nothing here is built for a rule that does not exist yet. There is one level, no fact store, no cross-process split and no reading of compiler output, because one module-level rule needs none of them. The build enforces that: -Wunused-packages, -Wunused-top-binds and weeder all run as errors, so machinery that stops being used stops compiling. What comes next, each with the rule that pays for it: suppressions and comment attachment with the first comment rule, the fact store with the first package rule, and the artifacts and the cross-process split with the first project rule.