home ~ projects ~ socials

Embed Files in a Rust Binary

NOTE: There's a version of this in the rust-grimoire.

---
[dependencies]
anyhow = "1.0.98"
rust-embed = "8.7"
---

#![allow(unused)]
use anyhow::Result;
use rust_embed::RustEmbed;
use std::fs::File;
use std::path::PathBuf;
use std::io::prelude::*;

#[derive(RustEmbed)]
#[folder = "rust_embed_test/input"]
struct FilePayload;

fn main() -> Result<()> {
  extra_files()?;
  Ok(())
}

fn extra_files() -> Result<()> {
    let output_root = PathBuf::from("test_output");
    for file in FilePayload::iter() {
        let name = file.as_ref();
        println!("Extracting: {}", name);
        let output_path = output_root.join(name);
        if let Some(content) = FilePayload::get(name) {
            if let Some(parent) = output_path.parent() {
                if !parent.exists() {
                    std::fs::create_dir_all(parent)?
                }
            }
            let body: Vec<u8> = content.data.into();
            let mut output = File::create(output_path)?;
            output.write_all(&body)?;
        }
    }
    Ok(())
}
Output:
Extracting: alfa.txt
Extracting: pixel-alfa.png
Extracting: sub-dir/bravo.txt
Extracting: sub-dir/pixel-bravo.png
Extracting: sub-dir/sub-sub-dir/charlie.txt
Extracting: sub-dir/sub-sub-dir/pixel-charlie.png
-- end of line --

References