Skip to main content

lux_cli/
generate_rockspec.rs

1use clap::Args;
2use eyre::Result;
3use lux_lib::{package::PackageName, project::Project, rockspec::Rockspec, workspace::Workspace};
4use std::path::PathBuf;
5
6#[derive(Args)]
7pub struct GenerateRockspec {
8    /// Package to generate the rockspec for.
9    #[arg(short, long, visible_short_alias = 'p')]
10    package: Option<PackageName>,
11
12    /// Output a JSON list of paths to the generated rockspecs.
13    #[arg(long)]
14    porcelain: bool,
15}
16
17pub async fn generate_rockspec(data: GenerateRockspec) -> Result<()> {
18    let workspace = Workspace::current_or_err()?;
19
20    let targets: Vec<&Project> = match &data.package {
21        Some(package) => vec![workspace.select_member(package)?],
22        None => workspace.members().into_iter().collect(),
23    };
24
25    let mut generated_paths = Vec::new();
26
27    for project in targets {
28        let path = generate_project_rockspec(project).await?;
29
30        if !data.porcelain {
31            println!("Wrote rockspec to {}", path.display());
32        }
33
34        generated_paths.push(path.to_string_lossy().into_owned());
35    }
36
37    if data.porcelain {
38        println!("{}", serde_json::to_string(&generated_paths)?);
39    }
40
41    Ok(())
42}
43
44async fn generate_project_rockspec(project: &Project) -> Result<PathBuf> {
45    let toml = project.toml().into_remote(None)?;
46    let rockspec = toml.to_lua_remote_rockspec_string()?;
47
48    let path = project
49        .root()
50        .join(format!("{}-{}.rockspec", toml.package(), toml.version()));
51
52    tokio::fs::write(&path, rockspec).await?;
53
54    Ok(path)
55}