# `AshPhoenix`
[🔗](https://github.com/ash-project/ash_phoenix/blob/v2.3.21/lib/ash_phoenix.ex#L5)

An extension to add form builders to the code interface.

There is currently no DSL for this extension.

This defines a `form_to_<name>` function for each code interface
function. Arguments are processed according to any custom input
transformations defined on the code interface, while the `params`
option remains untouched.

The generated function passes all options through to
`AshPhoenix.Form.for_action/3`

Update and destroy actions take the record being updated/destroyed
as the first argument.

For example, given this code interface definition on a domain
called `MyApp.Accounts`:

```elixir
resources do
  resource MyApp.Accounts.User do
    define :register_with_password, args: [:email, :password]
    define :update_user, action: :update, args: [:email, :password]
  end
end
```

Adding the `AshPhoenix` extension would define
`form_to_register_with_password/2`.

## Custom Input Transformations

If your code interface defines custom inputs with transformations,
the form interface will honor those transformations for arguments,
but not for params passed via the `params` option:

```elixir
# In your domain
resource MyApp.Blog.Comment do
  define :create_with_post do
    action :create_with_post_id
    args [:post]

    custom_input :post, :struct do
      constraints instance_of: MyApp.Blog.Post
      transform to: :post_id, using: & &1.id
    end
  end
end

# Usage - the post argument will be transformed
form = MyApp.Blog.form_to_create_with_post(
  %MyApp.Blog.Post{id: "some-id"},
  params: %{"text" => "Hello world"}
)
# The post struct gets transformed to post_id in the form
# The params remain unchanged
```

## Usage

Without options:

```elixir
MyApp.Accounts.form_to_register_with_password()
#=> %AshPhoenix.Form{}
```

With options:

```elixir
MyApp.Accounts.form_to_register_with_password(params: %{"email" => "placeholder@email"})
#=> %AshPhoenix.Form{}
```

For update/destroy actions, the record is required as the first parameter:

```elixir
user = MyApp.Accounts.get_user!(id)
MyApp.Accounts.form_to_update_user(user)
#=> %AshPhoenix.Form{}
```

Update/destroy with options

```elixir
user = MyApp.Accounts.get_user!(id)
MyApp.Accounts.form_to_update_user(user, params: %{"email" => "placeholder@email"})
#=> %AshPhoenix.Form{}
```

# `forms`
*macro* 

---

*Consult [api-reference.md](api-reference.md) for complete listing*
