README.md

# Sheen

[![Package Version](https://img.shields.io/hexpm/v/sheen)](https://hex.pm/packages/sheen)
[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/sheen/)

```sh
gleam add sheen
```

Sheen is a library for creating command line argument parsers. It has a convenient and type safe API.

```gleam
import argv
import sheen
import sheen/flag
import sheen/arg
import sheen/named

type Mode {
  Sum
  Product
}

type Args {
  Args(verbosity: Int, numbers: List(Int), mode: Mode)
}

fn parser() -> sheen.Parser(Args) {
  // You are asserting that you've built the parser correctly
  // Otherwise you will receive informative errors
  let assert Ok(parser) =
    sheen.new()
    |> sheen.name("Number cruncher")
    |> sheen.version("0.1.0")
    |> sheen.authors(["Ellie"])
    |> sheen.build({
      use verbosity <-
        flag.new("verbose")
        |> flag.count()

      use mode <-
        named.new("mode")
        |> named.enum([#("sum", Sum), #("product", Product)])
        |> named.required()

      use numbers <-
        arg.new()
        |> arg.integer()
        |> arg.repeated()

      sheen.return({
        use verbosity <- verbosity
        use numbers <- numbers
        use mode <- mode
        sheen.valid(Args(verbosity, numbers, mode))
      })
    })
  parser
}

pub fn main() {
  let parse_result =
    parser()
    |> sheen.run(argv.load().arguments)
  case parse_result {
    Ok(args) -> {
      // Run you program with the parsed arguments
      todo
    }
    Error(errors) -> {
      // Sheen collects all errors and returns them as a list
      // Later I will add a way to pretty print them, and then
      // show usage information
      todo
    }
  }
}
```

Further documentation can be found at <https://hexdocs.pm/sheen>.