# Request

<a id="request-2"></a>

# Request

```cpp
#include <icy/request.h>

template<typename T, typename E = BasicEvent>
struct Request
```

[Defined in src/base/include/icy/request.h:45](https://github.com/auscaster/icey/blob/main/src/base/include/icy/request.h#L45)

Wrapper class for managing `uv_req_t` variants.

This class provides safe access to the parent handle in case the handle gets destroyed before the request callback returns, and should be used whenever the handle pointer is accessed via the callback.

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| `T` | [`req`](#req-1)  | The underlying libuv request object. |
| `std::function< void(const E &)>` | [`callback`](#callback-1)  | Called when the request completes. |

---

<a id="req-1"></a>

### req

```cpp
T req
```

[Defined in src/base/include/icy/request.h:50](https://github.com/auscaster/icey/blob/main/src/base/include/icy/request.h#L50)

The underlying libuv request object.

---

<a id="callback-1"></a>

### callback

```cpp
std::function< void(const E &)> callback
```

[Defined in src/base/include/icy/request.h:51](https://github.com/auscaster/icey/blob/main/src/base/include/icy/request.h#L51)

Called when the request completes.

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`Request`](#request-3) `inline` | Construct the request and set `req.data` to `this` so callbacks can recover the wrapper pointer. |
| `auto` | [`invoke`](#invoke-1) `inline` `-> std::enable_if_t<!std::is_void< std::invoke_result_t< F, Args... > >::value, int >` | Call `f` with `args`. If `f` returns a non-zero libuv error code, the `callback` is invoked immediately with that status. |
| `auto` | [`invoke`](#invoke-2) `inline` `-> std::enable_if_t< std::is_void< std::invoke_result_t< F, Args... > >::value >` | Call `f` with `args`. Overload for void-returning functions; no error checking is performed. |

---

<a id="request-3"></a>

### Request

`inline`

```cpp
inline Request()
```

[Defined in src/base/include/icy/request.h:55](https://github.com/auscaster/icey/blob/main/src/base/include/icy/request.h#L55)

Construct the request and set `req.data` to `this` so callbacks can recover the wrapper pointer.

---

<a id="invoke-1"></a>

### invoke

`inline` `-> std::enable_if_t<!std::is_void< std::invoke_result_t< F, Args... > >::value, int >`

```cpp
template<typename F, typename... Args> inline auto invoke(F && f, Args &&... args) -> std::enable_if_t<!std::is_void< std::invoke_result_t< F, Args... > >::value, int >
```

[Defined in src/base/include/icy/request.h:82](https://github.com/auscaster/icey/blob/main/src/base/include/icy/request.h#L82)

Call `f` with `args`. If `f` returns a non-zero libuv error code, the `callback` is invoked immediately with that status.

Enabled only when `f` returns a non-void type (i.e. an error code).

#### Returns
`true` (non-zero = success) if `f` returned 0; `false` on error.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `f` | `F &&` | libuv function to call. |
| `args` | `Args &&...` | Arguments forwarded to `f`. |

---

<a id="invoke-2"></a>

### invoke

`inline` `-> std::enable_if_t< std::is_void< std::invoke_result_t< F, Args... > >::value >`

```cpp
template<typename F, typename... Args> inline auto invoke(F && f, Args &&... args) -> std::enable_if_t< std::is_void< std::invoke_result_t< F, Args... > >::value >
```

[Defined in src/base/include/icy/request.h:97](https://github.com/auscaster/icey/blob/main/src/base/include/icy/request.h#L97)

Call `f` with `args`. Overload for void-returning functions; no error checking is performed.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `f` | `F &&` | Function to call. |
| `args` | `Args &&...` | Arguments forwarded to `f`. |

## Public Static Methods

| Return | Name | Description |
|--------|------|-------------|
| `void` | [`defaultCallback`](#defaultcallback) `static` `inline` | Standard libuv completion callback. Invokes `callback` with the status event and then deletes the [`Request`](#request-2) wrapper. |

---

<a id="defaultcallback"></a>

### defaultCallback

`static` `inline`

```cpp
static inline void defaultCallback(T * req, int status)
```

[Defined in src/base/include/icy/request.h:65](https://github.com/auscaster/icey/blob/main/src/base/include/icy/request.h#L65)

Standard libuv completion callback. Invokes `callback` with the status event and then deletes the [`Request`](#request-2) wrapper.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `req` | `T *` | The completed libuv request. |
| `status` | `int` | libuv status code (0 on success, negative on error). |

## Public Types

| Name | Description |
|------|-------------|
| [`Type`](#type-11)  |  |
| [`Event`](#event)  |  |

---

<a id="type-11"></a>

### Type

```cpp
using Type = T
```

[Defined in src/base/include/icy/request.h:47](https://github.com/auscaster/icey/blob/main/src/base/include/icy/request.h#L47)

---

<a id="event"></a>

### Event

```cpp
using Event = E
```

[Defined in src/base/include/icy/request.h:48](https://github.com/auscaster/icey/blob/main/src/base/include/icy/request.h#L48)
