use axum::{Json, Router, response::IntoResponse, routing::post};
use axum_params::{Params, UploadFile};
use serde::Deserialize;
use serde_json::json;
use tokio::io::AsyncReadExt;
#[derive(Debug, Deserialize)]
struct FileUploadParams {
title: String,
description: Option<String>,
file: UploadFile,
}
#[axum::debug_handler]
async fn file_upload_handler(Params(upload, _): Params<FileUploadParams>) -> impl IntoResponse {
let mut temp_file = upload.file.open().await.unwrap();
let mut content = String::new();
temp_file.read_to_string(&mut content).await.unwrap();
Json(json!({
"title": upload.title,
"description": upload.description,
"file_name": upload.file.name,
"file_content": content,
}))
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/upload", post(file_upload_handler));
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
.await
.unwrap();
println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap();
}