use axum::http::HeaderMap;
use serde_json::Value;
pub fn list_buckets_xml(buckets: &[String]) -> (HeaderMap, String) {
let mut headers = HeaderMap::new();
headers.insert("Content-Type", "application/xml".parse().unwrap());
let bucket_entries = buckets
.iter()
.map(|b| {
format!(
"{}2026-05-27T00:00:00Z",
b
)
})
.collect::>()
.join("\n ");
let xml = format!(
"
owner-id
MarkBase
{}
",
bucket_entries
);
(headers, xml)
}
pub fn list_objects_xml(bucket_name: &str, objects: &[Value]) -> (HeaderMap, String) {
let mut headers = HeaderMap::new();
headers.insert("Content-Type", "application/xml".parse().unwrap());
let object_entries = objects
.iter()
.map(|obj| {
let key = obj.get("Key").and_then(|k| k.as_str()).unwrap_or("");
let last_modified = obj
.get("LastModified")
.and_then(|l| l.as_str())
.unwrap_or("");
let etag = obj.get("ETag").and_then(|e| e.as_str()).unwrap_or("");
let size = obj.get("Size").and_then(|s| s.as_i64()).unwrap_or(0);
format!(
"
{}
{}
{}
{}
",
key, last_modified, etag, size
)
})
.collect::>()
.join("\n ");
let xml = format!(
"
{}
1000
false
{}
",
bucket_name, object_entries
);
(headers, xml)
}
pub fn initiate_multipart_upload_xml(bucket: &str, key: &str, upload_id: &str) -> (HeaderMap, String) {
let mut headers = HeaderMap::new();
headers.insert("Content-Type", "application/xml".parse().unwrap());
let xml = format!(
"
{}
{}
{}
",
bucket, key, upload_id
);
(headers, xml)
}
pub fn complete_multipart_upload_xml(bucket: &str, key: &str, etag: &str) -> (HeaderMap, String) {
let mut headers = HeaderMap::new();
headers.insert("Content-Type", "application/xml".parse().unwrap());
let xml = format!(
"
http://localhost:11438/s3/{}/{}
{}
{}
{}
",
bucket, key, bucket, key, etag
);
(headers, xml)
}