Skip to main content

gproxy_protocol/claude/file_upload/
request.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::claude::types::{AnthropicBeta, AnthropicVersion, HttpMethod};
6
7/// Request descriptor for Claude "Upload File" endpoint.
8///
9/// `POST /v1/files` — multipart/form-data upload.
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11pub struct ClaudeFileUploadRequest {
12    /// HTTP method.
13    pub method: HttpMethod,
14    /// Path parameters.
15    pub path: PathParameters,
16    /// Query parameters.
17    pub query: QueryParameters,
18    /// Request headers.
19    pub headers: RequestHeaders,
20    /// Multipart body descriptor.
21    pub body: RequestBody,
22}
23
24impl Default for ClaudeFileUploadRequest {
25    fn default() -> Self {
26        Self {
27            method: HttpMethod::Post,
28            path: PathParameters::default(),
29            query: QueryParameters::default(),
30            headers: RequestHeaders::default(),
31            body: RequestBody::default(),
32        }
33    }
34}
35
36#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
37pub struct PathParameters {}
38
39#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
40pub struct QueryParameters {}
41
42#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
43pub struct RequestHeaders {
44    #[serde(rename = "anthropic-version")]
45    pub anthropic_version: AnthropicVersion,
46    #[serde(
47        rename = "anthropic-beta",
48        default,
49        skip_serializing_if = "Option::is_none"
50    )]
51    pub anthropic_beta: Option<Vec<AnthropicBeta>>,
52    #[serde(flatten, default, skip_serializing_if = "BTreeMap::is_empty")]
53    pub extra: BTreeMap<String, String>,
54}
55
56/// Multipart body for file upload.
57///
58/// The actual HTTP request uses `multipart/form-data` with a `file` part
59/// and an optional `purpose` part.  This struct captures the logical fields.
60#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
61pub struct RequestBody {
62    /// Raw file bytes (the `file` multipart part).
63    #[serde(default, skip_serializing_if = "Vec::is_empty")]
64    pub file: Vec<u8>,
65    /// Original filename for the `file` part.
66    #[serde(default, skip_serializing_if = "Option::is_none")]
67    pub filename: Option<String>,
68    /// Upload purpose (e.g. `"user_data"`).
69    #[serde(default, skip_serializing_if = "Option::is_none")]
70    pub purpose: Option<String>,
71}