1use include_dir::{include_dir, Dir};
2use log::debug;
3use std::fs;
4use std::path::Path;
5
6static STDLIB_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/stdlib");
8const VERSION: &str = env!("ZKPYC_STDLIB_VERSION");
9
10pub struct StdLib;
11
12impl StdLib {
13 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 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 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 pub fn version() -> &'static str {
52 VERSION
53 }
54}