# report
[![Package Version](https://img.shields.io/hexpm/v/report)](https://hex.pm/packages/report)
[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/report/)
Create informative & beautiful source code reports.
> Note: this package is not ready for production yet.
![example report output](./assets/example_output.png)
## Usage
Install with the `gleam` CLI. This package works on all targets!
```sh
gleam add report
```
The following code will display the demo report found in the image above.
```gleam
import gleam/io
import report
/// The source code to be annotated in the report.
const source = "fizz₂ : Nat -> String
fizz₂ num =
case (mod num 5) (mod num 3) of
0 0 => \"FizzBuzz\"
0 _ => \"Fizz\"
_ 0 => \"Buzz\"
_ _ => num"
pub fn main() {
let file = "FizzBuzz.fun"
let message = "`case` clauses have incompatible types"
// Labels add annotations to the source code. There is normally one primary
// label and any number of secondary and context labels.
let labels = [
report.primary_label(
message: "expected `String`, found `Nat`",
from: #(7, 16),
to: #(7, 19),
),
report.context_label(
message: "`case` clauses have incompatible types",
from: #(3, 5),
to: #(7, 19),
),
report.secondary_label(
message: "this is found to be of type `String`",
from: #(4, 16),
to: #(4, 26),
),
report.secondary_label(
message: "this is found to be of type `String`",
from: #(5, 16),
to: #(5, 22),
),
report.secondary_label(
message: "this is found to be of type `String`",
from: #(6, 16),
to: #(6, 22),
),
report.secondary_label(
message: "expected type `String` found here",
from: #(1, 16),
to: #(1, 22),
),
]
// Additional information can be added to the end of a report.
let info = [
report.Rows(
rows: [#("expected type", "String"), #("found type", "Nat")],
divider: " = ",
),
report.Text(
"All `case` clauses must evaluate to the same type, but the indicated branch does not have the same type as the others.",
),
]
// Create an error report. This could also be `report.warning` or `report.info`.
report.error(file:, source:, message:, labels:, info:)
// Finally, turn the report into a string with styling enabled then log the
// result to the console.
|> report.to_string(style: True)
|> io.println_error
}
```
Documentation can be found at <https://hexdocs.pm/report>.
## Versioning
This package follows semver, but stylistic changes such as tweaking colors are not covered by a major version. There will be no breaking changes to the actual API without a major bump.
## Development
```sh
gleam run # Run the project
gleam test # Run the tests
```
## Inspiration
This package is inspired by similar projects such as [`hug`](https://hexdocs.pm/hug/), [`diagnose`](https://github.com/Mesabloo/diagnose), and [`codespan-reporting`](https://github.com/brendanzab/codespan). The example above is based on the example in `codespan-reporting`'s README.