# `JSONRPC2.Spec.Request`

Struct which represents JSONRPC request.

# `t`

```elixir
@type t() :: %JSONRPC2.Spec.Request{
  id: JSONRPC2.Spec.id(),
  jsonrpc: String.t(),
  method: JSONRPC2.Spec.method(),
  params: JSONRPC2.Spec.params()
}
```

# `is_id`
*macro* 

# `is_params`
*macro* 

# `new`

```elixir
@spec new(JSONRPC2.Spec.method(), JSONRPC2.Spec.params(), JSONRPC2.Spec.id()) :: t()
```

Instantiate a request struct

# `parse`

Build a request struct from input data

Example:

    iex> Request.parse(%{"id" => 123, "method" => "add", "params" => %{"x" => 15, "y" => 51}, "jsonrpc" => "2.0"})
    {:ok, %Request{id: 123, method: "add", params: %{"x" => 15, "y" => 51}, jsonrpc: "2.0"}}

    iex> Request.parse(%{"id" => nil, "method" => "add", "params" => %{"x" => 15, "y" => 51}, "jsonrpc" => "2.0"})
    {:ok, %Request{id: nil, method: "add", params: %{"x" => 15, "y" => 51}, jsonrpc: "2.0"}}

    iex> Request.parse(%{"id" => 123, "method" => "add", "params" => %{"x" => 15, "y" => 51}})
    {:invalid, 123}

    iex> Request.parse(%{"method" => "add", "params" => %{"x" => 15, "y" => 51}, "jsonrpc" => "2.0"})
    {:invalid, nil}

# `valid?`

```elixir
@spec valid?(t()) :: :ok | :invalid
```

Validate a request struct

---

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