use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct UploadChunkRequest {
pub file_id: String,
pub chunk_number: u32,
pub total_chunks: u32,
pub data: Vec<u8>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct UploadChunkResponse {
pub success: bool,
pub bytes_received: usize,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct DownloadChunkRequest {
pub file_id: String,
pub chunk_number: u32,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct DownloadChunkResponse {
pub data: Vec<u8>,
pub chunk_number: u32,
pub is_last_chunk: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct FileInfoRequest {
pub file_id: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct FileInfoResponse {
pub file_id: String,
pub total_size: u64,
pub total_chunks: u32,
pub chunk_size: u32,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum FileTransferError {
FileNotFound,
ChunkOutOfRange,
InvalidFileId,
ChunkTooLarge,
StorageError(String),
}
#[rpcnet::service]
pub trait FileTransfer {
async fn upload_chunk(&self, request: UploadChunkRequest) -> Result<UploadChunkResponse, FileTransferError>;
async fn download_chunk(&self, request: DownloadChunkRequest) -> Result<DownloadChunkResponse, FileTransferError>;
async fn get_file_info(&self, request: FileInfoRequest) -> Result<FileInfoResponse, FileTransferError>;
}