README.md

# AshReqOpt

An extension library for the Ash framework that provides clearer ways to define required and optional attributes and relationships in your resources.

## Features

- Define required/optional attributes using `req` and `opt` macros
  - Instead of `attribute :email, :string, allow_nil?: false`, use `req :email, :string`
  - Instead of `attribute :name, :string, allow_nil?: true`, use `opt :name, :string`
  - You can still use the original `attribute` macro if you prefer
- Define required/optional relationships using `req_belongs_to` and `opt_belongs_to` macros
  - Instead of `belongs_to :company, Company, allow_nil?: false`, use `req_belongs_to :company, Company`
  - Instead of `belongs_to :manager, User, allow_nil?: true`, use `opt_belongs_to :manager, User`
  - You can still use the original `belongs_to` macro if you prefer
- Extends Ash resource DSL for more explicit intent

## Installation

Add `ash_req_opt` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:ash_req_opt, "~> 0.1.0"}
  ]
end
```

## Usage Example

```elixir
defmodule MyApp.User do
  use Ash.Resource,
    extensions: [AshReqOpt]

  attributes do
    uuid_primary_key :id
    req :email, :string    # Required attribute (equivalent to allow_nil?: false)
    opt :name, :string     # Optional attribute (equivalent to allow_nil?: true)
    attribute :nickname, :string, allow_nil?: true  # Original attribute macro still works
  end

  relationships do
    req_belongs_to :company, Company    # Required relationship (equivalent to allow_nil?: false)
    opt_belongs_to :manager, User       # Optional relationship (equivalent to allow_nil?: true)
    belongs_to :department, Department, allow_nil?: true  # Original belongs_to macro still works
  end
end
```

## License

MIT