#quake #bsp #map #子进程 #游戏开发 #临时目录 #aas

quake-bspc

异步包装Quake BSP编译器'bspc'作为子进程运行

6个版本

0.1.5 2022年11月24日
0.1.4 2022年11月22日

#915 in 游戏开发

MIT/Apache

125KB
489

包含 (ELF可执行文件/库, 240KB) test_resources/bspci386

quake-bspc

License Latest Version Documentation

此库通过创建子进程并异步等待其输出,提供围绕Quake编译器bspc的简单接口。

一些功能包括

  • 设置临时目录以存储输入/输出文件
  • 解析输出日志以查找错误/警告
  • 实时流输出日志(通过 OptionsBuilder::log_stream

BSPC工具本身不包括在库中。而是在库使用之前,它需要在文件系统中已存在。

示例

基本示例,展示将Quake BSP文件转换为MAP文件的过程

use bspc::{Command, Options};
use tokio_util::sync::CancellationToken;

let bsp_contents = b"...";
let result = bspc::convert(
    "./path/to/bspc.exe",
    Command::BspToMap(bsp_contents),
    Options::builder()
        .verbose(true)
        .build(),
)
.await;
match result {
    Ok(output) => {
        assert_eq!(output.files.len(), 1);
        println!("{}", output.files[0].name);
        println!("{}", String::from_utf8_lossy(&output.files[0].contents));
    }
    Err(err) => {
        println!("Conversion failed: {}", err);
    }
}

带有取消的示例

以下代码片段演示了如何通过取消令牌取消转换(在这种情况下,使用超时)。请注意,取消操作并非简单地通过丢弃future(如通常在异步Rust中那样)来完成,因为我们希望确保在future完成之前杀死子进程并删除临时目录。

use bspc::{Command, Options, ConversionError};
use tokio_util::sync::CancellationToken;

let bsp_contents = b"...";
let cancel_token = CancellationToken::new();
let cancel_task = {
    let cancel_token = cancel_token.clone();
    tokio::spawn(async move {
        tokio::time::sleep(std::time::Duration::from_secs(10)).await;
        cancel_token.cancel();
    })
};
let result = bspc::convert(
    "./path/to/bspc.exe",
    Command::BspToMap(bsp_contents),
    Options::builder()
        .verbose(true)
        .cancellation_token(cancel_token)
        .build(),
)
.await;
match result {
    Ok(output) => {
        assert_eq!(output.files.len(), 1);
        println!("{}", output.files[0].name);
        println!("{}", String::from_utf8_lossy(&output.files[0].contents));
    }
    Err(ConversionError::Cancelled) => {
        println!("Conversion timed out after 10 seconds");
    }
    Err(err) => {
        println!("Conversion failed: {}", err);
    }
}

许可证

根据以下任一许可证授权:

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,均应根据上述方式双授权,不附加任何其他条款或条件。

依赖项

~139MB
~2.5M SLoC