technitium 0.4.0

Typed async Rust client for the Technitium DNS Server API
Documentation
# Install App

## Endpoint
`/api/apps/install`

## Method
POST (multipart form data)

## Description
Installs a DNS application on the DNS server by uploading a zip file directly.

## Authentication
Required. Session token from `login` or `createToken`.

## Permissions
Apps: Delete

## Parameters

| Name  | Type   | Required | Conditional | Description |
|-------|--------|----------|-------------|-------------|
| token | string | Yes      | No          | The session token generated by the `login` or the `createToken` call. Passed as a query parameter in the URL. |
| name  | string | Yes      | No          | The name of the app to install. Passed as a query parameter in the URL. |
| (file body) | binary | Yes | No | The DNS application zip file data in binary format, sent as multipart form data in the request body. |

## Response Fields

| Field | Type | Description |
|-------|------|-------------|
| response.installedApp | object | The newly installed app object. |
| response.installedApp.name | string | Name of the installed app. |
| response.installedApp.version | string | Version string of the installed app. |
| response.installedApp.dnsApps | array | Array of DNS app class entries within this app. |
| response.installedApp.dnsApps[].classPath | string | The fully qualified class path of the DNS app. |
| response.installedApp.dnsApps[].description | string | Human-readable description of what the DNS app does. |
| response.installedApp.dnsApps[].isAppRecordRequestHandler | bool | Whether this app handles APP record requests. |
| response.installedApp.dnsApps[].recordDataTemplate | string or null | Template for APP record data. Only present when `isAppRecordRequestHandler` is true. |
| response.installedApp.dnsApps[].isRequestController | bool | Whether this app acts as a request controller. |
| response.installedApp.dnsApps[].isAuthoritativeRequestHandler | bool | Whether this app handles authoritative requests. |
| response.installedApp.dnsApps[].isRequestBlockingHandler | bool | Whether this app handles request blocking. |
| response.installedApp.dnsApps[].isQueryLogger | bool | Whether this app acts as a query logger. |
| response.installedApp.dnsApps[].isPostProcessor | bool | Whether this app acts as a post processor. |

## Conditional Logic Notes
- Unlike `downloadAndInstall`, this endpoint does NOT download the zip from a URL. The zip file is uploaded directly in the request body.
- Despite being a "Delete" permission level, this endpoint installs apps. The permission model uses "Delete" as the highest privilege tier for app management.

## Edge Cases
- **This is a multipart form data POST request.** The request body must contain the DNS application zip file in binary format as multipart form data. This is different from most other API calls which use GET with query parameters.
- The `token` and `name` parameters are passed as URL query parameters, not in the multipart body.
- The docs do not specify the form field name for the file upload. Implementation should test with common field names (e.g., `fileData`, `file`).
- No `url` parameter is needed since the file is uploaded directly.