gpt4 book ai didi

rust - 我如何使用 include_str!对于多个文件或整个目录?

转载 作者:行者123 更新时间:2023-11-29 08:10:48 25 4
gpt4 key购买 nike

我想将整个目录复制到用户的 $HOME 中的某个位置。将文件单独复制到该目录很简单:

let contents = include_str!("resources/profiles/default.json");
let fpath = dpath.join(&fname);
fs::write(fpath, contents).expect(&format!("failed to create profile: {}", n));

我还没有找到使它适应多个文件的方法:

for n in ["default"] {
let fname = format!("{}{}", n, ".json");
let x = format!("resources/profiles/{}", fname).as_str();
let contents = include_str!(x);
let fpath = dpath.join(&fname);
fs::write(fpath, contents).expect(&format!("failed to create profile: {}", n));
}

...编译器提示 x 必须是字符串文字。

据我所知,有两种选择:

  1. 编写自定义宏。
  2. 为我要复制的每个文件复制第一个代码。

这样做的最佳方法是什么?

最佳答案

我会创建 a build script遍历一个目录,构建一个元组数组,其中包含名称和另一个宏调用以包含原始数据:

use std::{
env,
error::Error,
fs::{self, File},
io::Write,
path::Path,
};

const SOURCE_DIR: &str = "some/path/to/include";

fn main() -> Result<(), Box<dyn Error>> {
let out_dir = env::var("OUT_DIR")?;
let dest_path = Path::new(&out_dir).join("all_the_files.rs");
let mut all_the_files = File::create(&dest_path)?;

writeln!(&mut all_the_files, r##"["##,)?;

for f in fs::read_dir(SOURCE_DIR)? {
let f = f?;

if !f.file_type()?.is_file() {
continue;
}

writeln!(
&mut all_the_files,
r##"("{name}", include_bytes!(r#"{name}"#)),"##,
name = f.path().display(),
)?;
}

writeln!(&mut all_the_files, r##"]"##,)?;

Ok(())
}

这有一些弱点,即它要求路径可以表示为 &str。因为您已经在使用 include_string!,所以我认为这不是额外的要求。这也意味着生成的字符串必须是有效的 Rust 字符串。我们在生成的文件中使用原始字符串,但如果文件名包含字符串"#,这仍然会失败。更好的解决方案可能是使用str::escape_default

因为我们要包含文件,所以我使用了 include_bytes! 而不是 include_str!,但如果您确实需要,可以切换回去。原始字节跳过在编译时执行 UTF-8 验证,所以这是一个小胜利。

使用它涉及导入生成的值:

const ALL_THE_FILES: &[(&str, &[u8])] = &include!(concat!(env!("OUT_DIR"), "/all_the_files.rs"));

fn main() {
for (name, data) in ALL_THE_FILES {
println!("File {} is {} bytes", name, data.len());
}
}

另见:

关于rust - 我如何使用 include_str!对于多个文件或整个目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50553370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com