# `X402.Extensions.BuilderCode.Adapter`
[🔗](https://github.com/cardotrejos/x402/blob/v0.9.0/lib/x402/extensions/builder_code/adapter.ex#L1)

`X402.Extension` adapter advertising and validating the `builder-code` extension.

    plug X402.Plug.PaymentGate,
      routes: [...],
      extensions: [{X402.Extensions.BuilderCode.Adapter, app_code: "my_app"}]

Every 402 response advertises
`X402.Extensions.BuilderCode.extension(app_code, service_codes: ...)` and
every payment's echo is checked with
`X402.Extensions.BuilderCode.validate_echo/2` (in addition to the gate's
built-in check, which covers payloads that echo the extension without an
adapter configured).

# `advertise`
*since 0.9.0* 

```elixir
@spec advertise(
  keyword(),
  X402.Hooks.RequestContext.t()
) :: map()
```

Advertises the configured codes.

## Examples

    iex> context = X402.Hooks.RequestContext.new([])
    iex> X402.Extensions.BuilderCode.Adapter.advertise([app_code: "my_app", service_codes: ["sdk"]], context)["info"]
    %{"a" => "my_app", "s" => ["sdk"]}

# `init`
*since 0.9.0* 

```elixir
@spec init(keyword()) :: {:ok, keyword()} | {:error, String.t()}
```

Validates the adapter options.

## Options

* `:app_code` - Required. The application's builder code (`info.a`).

* `:service_codes` - The server's own service code(s) (`info.s`), at most 5. The default value is `[]`.

## Examples

    iex> {:ok, opts} = X402.Extensions.BuilderCode.Adapter.init(app_code: "my_app")
    iex> {opts[:app_code], opts[:service_codes]}
    {"my_app", []}

    iex> {:error, message} = X402.Extensions.BuilderCode.Adapter.init(app_code: "My App")
    iex> message =~ "invalid builder code"
    true

# `key`
*since 0.9.0* 

```elixir
@spec key() :: String.t()
```

Returns `"builder-code"`.

## Examples

    iex> X402.Extensions.BuilderCode.Adapter.key()
    "builder-code"

# `validate`
*since 0.9.0* 

```elixir
@spec validate(term(), term(), keyword()) ::
  :ok | {:error, X402.Extensions.BuilderCode.error()}
```

Validates the echoed value with `X402.Extensions.BuilderCode.validate_echo/2`.

## Examples

    iex> advertised = X402.Extensions.BuilderCode.extension("my_app")
    iex> X402.Extensions.BuilderCode.Adapter.validate(%{"a" => "my_app"}, advertised, [])
    :ok

---

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