zkpyc_stdlib/
lib.rs

1use include_dir::{include_dir, Dir};
2use log::debug;
3use std::fs;
4use std::path::Path;
5
6// Embed the stdlib directory using include_dir!
7static STDLIB_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/stdlib");
8const VERSION: &str = env!("ZKPYC_STDLIB_VERSION");
9
10pub struct StdLib;
11
12impl StdLib {
13    // Copy embedded stdlib to output_dir
14    pub fn copy_stdlib(output_dir: &Path) {
15        let stdlib_output_dir = output_dir.join("stdlib");
16        fs::create_dir_all(&stdlib_output_dir).expect("Failed to create stdlib output directory");
17        Self::copy_dir_recursive(&STDLIB_DIR, &stdlib_output_dir);
18
19        // Embed version number in version.txt
20        let version_file_path = stdlib_output_dir.join("version.txt");
21        fs::write(version_file_path, VERSION).expect("Failed to write stdlib version file");
22    }
23
24    // Helper function to copy directories and files recursively
25    fn copy_dir_recursive(dir: &Dir, output_dir: &Path) {
26        for entry in dir.entries() {
27            match entry {
28                include_dir::DirEntry::Dir(sub_dir) => {
29                    let sub_dir_output_path = output_dir.join(sub_dir.path());
30                    fs::create_dir_all(&sub_dir_output_path).unwrap_or_else(|_err| {
31                        panic!(
32                            "Failed to create subdirectory {}",
33                            &sub_dir_output_path.display()
34                        )
35                    });
36                    Self::copy_dir_recursive(sub_dir, &output_dir);
37                    debug!("Copied: {}", &sub_dir_output_path.display());
38                }
39                include_dir::DirEntry::File(file) => {
40                    let file_output_path = output_dir.join(file.path());
41                    fs::write(&file_output_path, file.contents()).unwrap_or_else(|_err| {
42                        panic!("Failed to write file {}", &file_output_path.display())
43                    });
44                    debug!("Copied: {}", &file_output_path.display());
45                }
46            }
47        }
48    }
49
50    // Return the version number
51    pub fn version() -> &'static str {
52        VERSION
53    }
54}