use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct WireUploadResponse {
pub id: String,
#[serde(default)]
#[allow(dead_code, reason = "captured for forward-compat / debugging")]
pub object: Option<String>,
#[serde(default)]
pub bytes: Option<u64>,
#[serde(default)]
pub created_at: Option<u64>,
#[serde(default)]
pub filename: Option<String>,
#[serde(default)]
#[allow(dead_code, reason = "captured for forward-compat / debugging")]
pub purpose: Option<String>,
#[serde(default)]
#[allow(dead_code, reason = "captured for forward-compat / debugging")]
pub status: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn parses_full_response() {
let v = json!({
"id": "file-abc123",
"object": "file",
"bytes": 512_u64,
"created_at": 1_700_000_000_u64,
"filename": "data.csv",
"purpose": "assistants",
"status": "processed",
});
let r: WireUploadResponse = serde_json::from_value(v).expect("parses");
assert_eq!(r.id, "file-abc123");
assert_eq!(r.bytes, Some(512));
assert_eq!(r.created_at, Some(1_700_000_000));
assert_eq!(r.filename.as_deref(), Some("data.csv"));
assert_eq!(r.purpose.as_deref(), Some("assistants"));
}
#[test]
fn parses_minimal_response() {
let v = json!({ "id": "file-1" });
let r: WireUploadResponse = serde_json::from_value(v).expect("parses");
assert_eq!(r.id, "file-1");
assert!(r.bytes.is_none());
assert!(r.filename.is_none());
assert!(r.created_at.is_none());
}
#[test]
fn parses_response_with_explicit_nulls() {
let v = json!({
"id": "file-x",
"object": "file",
"bytes": null,
"created_at": null,
"filename": null,
});
let r: WireUploadResponse = serde_json::from_value(v).expect("parses");
assert_eq!(r.id, "file-x");
assert!(r.bytes.is_none());
assert!(r.filename.is_none());
}
}