twitch_oauth_token 4.0.0

Type-safe Twitch OAuth 2.0 authentication library with CSRF protection and full scope support
Documentation
### 1. Update Feature Flags

```diff
[dependencies]
- twitch_oauth_token = { version = "3.1", features = ["oneshot-server"] }
+ twitch_oauth_token = { version = "4.0", features = ["oneshot"] }
```

### 2. Update Imports

```diff
- use twitch_oauth_token::{oneshot_server, OAuthCallbackQuery};
+ use twitch_oauth_token::{oneshot, AuthCallback};
```

### 3. Update Method Calls

#### Exchange authorization code

```diff
- let resp = oauth.user_access_token(code, state).await?;
- let token = resp.user_token().await?;
+ let token = oauth.exchange_code(code, state).await?;

```

#### Builder methods

```diff
- let oauth = TwitchOauth::new(id, secret).set_redirect_uri(url);
+ let oauth = TwitchOauth::new(id, secret).with_redirect_uri(url);
```

#### Response handling (no more wrapper)

```diff
// App token
- let resp = oauth.app_access_token().await?;
- let token = resp.app_token().await?;
+ let token = oauth.app_access_token().await?;

// Refresh token
- let resp = oauth.refresh_access_token(refresh_token).await?;
- let token = resp.user_token().await?;
+ let new_token = oauth.refresh_access_token(refresh_token).await?;

// Validate token
- let resp = oauth.validate_access_token(&access_token).await?;
- let token_info = resp.validate_token();
+ let token_info = oauth.validate_access_token(&access_token).await?;

// Revoke token
- let _resp = oauth.revoke_access_token(&access_token).await?;
+ oauth.revoke_access_token(&access_token).await?;
```

#### oneshot server

```diff
- use twitch_oauth_token::oneshot_server::oneshot_server;
- let callback = oneshot_server("127.0.0.1:3000", Duration::from_secs(120)).await?;
+ use twitch_oauth_token::{oneshot, AuthCallback};
+ let config = oneshot::Config::new()
+     .with_port(3000)
+     .with_duration(Duration::from_secs(120));
+ let callback: AuthCallback = oneshot::listen(config).await?;
```

### 4. Update Type Names

```diff
- CodeTokenRequest
+ ExchangeCodeRequest

- OAuthCallbackQuery
+ AuthCallback

- ValidateToken
+ TokenInfo
```

### 5. Error Handling

```diff
- error.is_validation_error()
- error.is_response_parsing_error()
+ error.is_decode()

- error.is_retryable()
- error.is_network_error()
+ error.is_request_error
```

### 5. Client Setup

```diff
- client::setup(|preset| {
-     Ok(preset
-         .timeouts(Duration::from_secs(60), Duration::from_secs(30))
-         .connections(10, Duration::from_secs(90))
-         .default_headers(|headers| {
-             headers
-                 .accept_json()
-                 .content_type_json()
-                 .header_str(HeaderName::from_str("Custom-Header")?, "value")?;
-             Ok(())
-         })?
-         .user_agent("MyApp/1.0"))
- })?;
+ use asknothingx2_util::api::preset;
+
+ let mut preset = preset::authentication("MyApp/1.0");
+ preset
+     .timeouts(Duration::from_secs(60), Duration::from_secs(30))
+     .connections(10, Duration::from_secs(90));
+
+ preset
+     .default_headers_mut()
+     .accept_json()
+     .content_type_json();
+     .header_str(HeaderName::from_str("Custom-Header")?, "value")?;
+
+ client::setup(preset.build()?)?;
```