56 lines
1.8 KiB
Rust
56 lines
1.8 KiB
Rust
use icepick_workflow::Workflow;
|
|
use std::{collections::BTreeMap, path::{PathBuf, Path}};
|
|
|
|
fn env_var(var: &'static str) -> String {
|
|
println!("cargo::rerun-if-env-changed={var}");
|
|
std::env::var(var).expect(var)
|
|
}
|
|
|
|
fn track_path(path: &Path) {
|
|
println!("cargo::rerun-if-changed={}", path.to_str().unwrap());
|
|
}
|
|
|
|
fn main() {
|
|
let out_dir = env_var("OUT_DIR");
|
|
let crate_dir = env_var("CARGO_MANIFEST_DIR");
|
|
let workflows_dir = PathBuf::from(crate_dir).join("workflows");
|
|
track_path(&workflows_dir);
|
|
|
|
let mut workflows_by_module: BTreeMap<String, Vec<Workflow>> = Default::default();
|
|
|
|
for module_dir in std::fs::read_dir(&workflows_dir).unwrap() {
|
|
let module_dir = module_dir.unwrap();
|
|
dbg!(&module_dir);
|
|
let path = module_dir.path();
|
|
if !path.is_dir() {
|
|
panic!("found unexpected file {}", path.to_string_lossy());
|
|
}
|
|
|
|
let mut workflows = vec![];
|
|
|
|
for workflow_file in std::fs::read_dir(&path).unwrap() {
|
|
dbg!(&workflow_file);
|
|
let workflow_file = workflow_file.unwrap();
|
|
let path = workflow_file.path();
|
|
if !path.is_file() {
|
|
panic!("found unexpected non-file {}", path.to_string_lossy());
|
|
}
|
|
|
|
let file_content = std::fs::read(path).unwrap();
|
|
let workflow: Workflow = serde_yaml::from_slice(&file_content).unwrap();
|
|
workflows.push(workflow);
|
|
}
|
|
|
|
workflows.sort_by(|a, b| a.name.cmp(&b.name));
|
|
|
|
workflows_by_module.insert(
|
|
module_dir.file_name().to_str().unwrap().to_owned(),
|
|
workflows,
|
|
);
|
|
}
|
|
let out_path = PathBuf::from(out_dir).join("workflows.hex");
|
|
let result = bincode::serialize(&workflows_by_module).unwrap();
|
|
let hexed = smex::encode(&result);
|
|
std::fs::write(out_path, hexed).unwrap();
|
|
}
|