# `Firkin.XML`
[🔗](https://harton.dev/james/firkin)

XML generation and parsing for S3 protocol messages.

Uses Saxy for both generation (simple form builder) and parsing
(SAX event-based parsing for request bodies).

# `complete_multipart_upload_response`

```elixir
@spec complete_multipart_upload_response(Firkin.CompleteResult.t()) :: String.t()
```

Generates the CompleteMultipartUploadResult XML response.

# `copy_object_response`

```elixir
@spec copy_object_response(Firkin.CopyResult.t()) :: String.t()
```

Generates the CopyObjectResult XML response.

# `delete_objects_response`

```elixir
@spec delete_objects_response(Firkin.DeleteResult.t()) :: String.t()
```

Generates the DeleteResult XML response.

# `error_response`

```elixir
@spec error_response(Firkin.Error.t()) :: String.t()
```

Generates an S3 error XML response.

# `get_bucket_location_response`

```elixir
@spec get_bucket_location_response(String.t()) :: String.t()
```

Generates the LocationConstraint XML response.

# `initiate_multipart_upload_response`

```elixir
@spec initiate_multipart_upload_response(String.t(), String.t(), String.t()) ::
  String.t()
```

Generates the InitiateMultipartUploadResult XML response.

# `list_buckets_response`

```elixir
@spec list_buckets_response([Firkin.Bucket.t()]) :: String.t()
```

Generates the ListAllMyBucketsResult XML response.

# `list_multipart_uploads_response`

```elixir
@spec list_multipart_uploads_response(Firkin.MultipartList.t()) :: String.t()
```

Generates the ListMultipartUploadsResult XML response.

# `list_objects_v2_response`

```elixir
@spec list_objects_v2_response(Firkin.ListResult.t()) :: String.t()
```

Generates the ListBucketResult (V2) XML response.

# `list_parts_response`

```elixir
@spec list_parts_response(Firkin.PartList.t()) :: String.t()
```

Generates the ListPartsResult XML response.

# `parse_complete_multipart`

```elixir
@spec parse_complete_multipart(String.t()) ::
  {:ok, [{pos_integer(), String.t()}]} | {:error, :invalid_xml}
```

Parses a CompleteMultipartUpload XML request body, extracting parts.

# `parse_delete_objects`

```elixir
@spec parse_delete_objects(String.t()) :: {:ok, [String.t()]} | {:error, :invalid_xml}
```

Parses a DeleteObjects XML request body, extracting the list of keys.

---

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