Rust入门实战 编写Minecraft启动器#4下载资源

首发于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用于计算文件的hashsha1用于计算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.rslibrary.rsversion.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Enaium

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值