1use rust_embed::Embed;
2use std::fs;
3use std::path::{Path, PathBuf};
4use veryl_path::{PathError, PathSet, ignore_already_exists};
5
6include!(concat!(env!("OUT_DIR"), "/std_hash.rs"));
7
8#[derive(Embed)]
9#[folder = "./veryl/src"]
10#[include = "*.veryl"]
11struct Asset;
12
13fn std_dir() -> PathBuf {
14 veryl_path::cache_path().join("std").join(STD_HASH)
15}
16
17pub fn expand() -> Result<(), PathError> {
18 let std_dir = std_dir();
19
20 if !std_dir.exists() {
21 ignore_already_exists(fs::create_dir_all(&std_dir))?;
22
23 let lock = veryl_path::lock_dir(&std_dir)?;
24
25 for file in Asset::iter() {
26 let content = Asset::get(file.as_ref()).unwrap();
27 let path = std_dir.join(file.as_ref());
28
29 let parent = path.parent().unwrap();
30 if !parent.exists() {
31 fs::create_dir_all(parent)?;
32 }
33
34 fs::write(&path, content.data.as_ref())?;
35 }
36
37 veryl_path::unlock_dir(lock)?;
38 }
39
40 Ok(())
41}
42
43pub fn paths(base_dst: &Path) -> Result<Vec<PathSet>, PathError> {
44 let mut ret = Vec::new();
45 let std_dir = std_dir().canonicalize().unwrap();
46
47 for src in &veryl_path::gather_files_with_extension(&std_dir, "veryl", false)? {
48 let rel = src.strip_prefix(&std_dir)?;
49 let mut dst = base_dst.join("std");
50 dst.push(rel);
51 dst.set_extension("sv");
52 let mut map = dst.to_path_buf();
53 map.set_extension("sv.map");
54 ret.push(PathSet {
55 prj: "$std".to_string(),
56 src: src.to_path_buf(),
57 dst,
58 map,
59 });
60 }
61
62 Ok(ret)
63}