use crate::models::FileEntry; use anyhow::Result; use reqwest::Client; use std::path::Path; use tokio::{ fs::{self, File}, io::AsyncWriteExt, }; /// Creates and writes container.xml. pub async fn write_container_xml(dest_root: &Path, opf_full_path: &str) -> Result<()> { // Create destination directory. let dest_dir = dest_root.join("META-INF"); fs::create_dir_all(&dest_dir).await?; // Create distination file. let dest_path = dest_dir.join("container.xml"); let mut file = File::create(dest_path).await?; // Prepare file contents. let contents = format!( r#" "# ); // Write down the file. file.write_all(contents.as_bytes()).await?; Ok(()) } pub async fn download_all_files( client: &Client, file_entries: &[FileEntry], dest_root: &Path, ) -> Result<()> { for entry in file_entries { let dest_path = dest_root.join(&entry.full_path); if let Some(parent_dir) = dest_path.parent() { fs::create_dir_all(parent_dir).await?; } let mut file = File::create(dest_path).await?; let bytes = client .get(&entry.url) .send() .await? .error_for_status()? .bytes() .await?; file.write_all(&bytes).await?; } Ok(()) }