1use anyhow::{Context, Result};
 2use clap::Parser;
 3use std::fs;
 4use std::path::Path;
 5
 6mod compare_perf;
 7mod danger;
 8mod nix_build;
 9mod release_nightly;
10mod run_bundling;
11
12mod release;
13mod run_agent_evals;
14mod run_tests;
15mod runners;
16mod steps;
17mod vars;
18
19#[derive(Parser)]
20pub struct GenerateWorkflowArgs {}
21
22pub fn run_workflows(_: GenerateWorkflowArgs) -> Result<()> {
23    let dir = Path::new(".github/workflows");
24
25    let workflows = vec![
26        ("danger.yml", danger::danger()),
27        ("run_bundling.yml", run_bundling::run_bundling()),
28        ("release_nightly.yml", release_nightly::release_nightly()),
29        ("run_tests.yml", run_tests::run_tests()),
30        ("release.yml", release::release()),
31        ("compare_perf.yml", compare_perf::compare_perf()),
32        ("run_unit_evals.yml", run_agent_evals::run_unit_evals()),
33        ("run_agent_evals.yml", run_agent_evals::run_agent_evals()),
34    ];
35    fs::create_dir_all(dir)
36        .with_context(|| format!("Failed to create directory: {}", dir.display()))?;
37
38    for (filename, workflow) in workflows {
39        let content = workflow
40            .to_string()
41            .map_err(|e| anyhow::anyhow!("{}: {:?}", filename, e))?;
42        let content = format!(
43            "# Generated from xtask::workflows::{}\n# Rebuild with `cargo xtask workflows`.\n{}",
44            workflow.name.unwrap(),
45            content
46        );
47        let file_path = dir.join(filename);
48        fs::write(&file_path, content)?;
49    }
50
51    Ok(())
52}