首发于Enaium的个人博客
首先我们需要添加几个依赖。
model = { path = "../model" }
parse = { path = "../parse" }
reqwest = { version = "0.12", features = ["blocking", "json"] }
file-hashing = { version = "0.1" }
sha1 = { version = "0.10" }
reqwest用于发送请求,file-hashing用于计算文件的hash,sha1用于计算sha1。
之后我们需要添加下载的trait。
pub trait Download {
fn download(&self, game_dir: &Path) -> Result<(), Box<dyn std::error::Error>>;
}
接着我们需要使用Client::builder()来创建一个Client,因为默认的get方法会用有个超时时间,而我们需要设置超时时间为无限。
pub fn get<T: reqwest::IntoUrl>(url: T) -> reqwest::Result<reqwest::blocking::Response> {
reqwest::blocking::Client::builder()
.timeout(None)
.build()?
.get(url)
.send()
}
最后我们需要创建一个计算文件hash的函数。
pub fn sha1<P: AsRef<Path>>(path: P) -> Result<String, std::io::Error> {
let mut hasher = Sha1::new();
file_hashing::get_hash_file(path, &mut hasher)
}
之后需要出创建asset.rs、library.rs、version.rs文件,分别对应下载资源、下载库、下载游戏版本。
asset.rs
use std::{
fs, path::Path};
use model::asset::*;
use parse::Parse;
use crate::{
get, Download};
impl Download for AssetIndex {
fn download(&self, game_dir: &Path) -> Result<(), Box<dyn std::error::Error>> {
println!("Downloading asset index:{}", self.id);
let indexes_dir = &game_dir.join("assets").join("indexes");
if !indexes_dir.exists() {
std::fs::create_dir_all(indexes_dir)?;
}
let path = &indexes_dir.join(&format!("{}.json", self.id));
std::fs::File::create(path)?;
let url = &self.url;
let text = &get(url)?.text()?;
std::fs::write(path, text)?;
let index = Index::parse(text)?;
let objects_dir = &game_dir.join("assets").joi

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



