veryl_std/
lib.rs

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}