README.md

# union_typespec

A simple, tiny, compile time-only library for defining an Elixir `@type` whose values
are one of a fixed set of options.

There are two ways to use it:

1. The `union_type` and `union_typep` macros, which replaces normal `@type`/`@typep` annotations with a nice,
   concise macro version of the type definition.
2. `UnionTypespec.union_type_ast/1`, which produces an AST you can `unquote` within
   the usual `@type` definition.

Here's what those look like in practice:

```elixir
defmodule MyModule do
  import UnionTypespec, only: [union_type: 1]

  @statuses [:read, :unread, :deleted]
  union_type status :: @statuses

  @permissions [:view, :edit, :admin]
  @type permission :: unquote(UnionTypespec.union_type_ast(@permissions))

  @spec get_permission() :: permission()
  def get_permission, do: Enum.random(@permissions)

  @spec get_status() :: status()
  def get_status, do: Enum.random(@statuses)
end
```

## Installation

You can install the package from Hex by adding this to your `mix.exs` file's dependencies:

```elixir
def deps do
  [
    {:union_typespec, "~> 0.0.4", runtime: false},
  ]
end
```