1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use rust_embed::Embed;
use std::fs;
use std::path::{Path, PathBuf};
use veryl_path::{PathError, PathPair};

include!(concat!(env!("OUT_DIR"), "/std_hash.rs"));

#[derive(Embed)]
#[folder = "./veryl/src"]
#[include = "*.veryl"]
struct Asset;

fn std_dir() -> PathBuf {
    veryl_path::cache_path().join("std").join(STD_HASH)
}

pub fn expand() -> Result<(), PathError> {
    let std_dir = std_dir();

    if !std_dir.exists() {
        fs::create_dir_all(&std_dir)?;

        let lock = veryl_path::lock_dir(&std_dir)?;

        for file in Asset::iter() {
            let content = Asset::get(file.as_ref()).unwrap();
            let path = std_dir.join(file.as_ref());

            let parent = path.parent().unwrap();
            if !parent.exists() {
                fs::create_dir_all(parent)?;
            }

            fs::write(&path, content.data.as_ref())?;
        }

        veryl_path::unlock_dir(lock)?;
    }

    Ok(())
}

pub fn paths(base_dst: &Path) -> Result<Vec<PathPair>, PathError> {
    let mut ret = Vec::new();
    let std_dir = std_dir().canonicalize().unwrap();

    for src in &veryl_path::gather_files_with_extension(&std_dir, "veryl", false)? {
        let rel = src.strip_prefix(&std_dir)?;
        let mut dst = base_dst.join("std");
        dst.push(rel);
        dst.set_extension("sv");
        ret.push(PathPair {
            prj: "$std".to_string(),
            src: src.to_path_buf(),
            dst,
        });
    }

    Ok(ret)
}