# `Snodo.Extension.Method`
[🔗](https://github.com/joshrotenberg/snodo/blob/v0.2.0/lib/snodo/extension/method.ex#L1)

An exact-versioned extension method mapped to a static operation term.

# `t`

```elixir
@type t() :: %Snodo.Extension.Method{
  direction: :client_to_server,
  kind: :request,
  name: String.t(),
  operation: term(),
  params: :required | :optional,
  protocol_version: String.t(),
  rule: Snodo.Protocol.Profile.Method.t()
}
```

# `new!`

```elixir
@spec new!(keyword()) :: t()
```

Builds a method for an extension's `c:Snodo.Extension.methods/0` list.

Options:

  * `:protocol_version` - the exact protocol version the method belongs
    to, such as `"2026-07-28"`. Required.
  * `:name` - the JSON-RPC method name. Required.
  * `:operation` - the term passed to the extension's
    `c:Snodo.Extension.validate_operation/3`, `c:Snodo.Extension.dispatch/3`,
    and `c:Snodo.Extension.shape_result/3`. Required.
  * `:params` - `:required` (the default) or `:optional`: whether a request
    must carry `params`.
  * `:kind` and `:direction` - only `:request` and `:client_to_server`,
    the defaults, are supported.

A missing required option raises `KeyError`; an invalid value raises
`ArgumentError`.

    Snodo.Extension.Method.new!(
      protocol_version: "2026-07-28",
      name: "dev.example/greet",
      operation: :greet
    )

---

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