use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "pleme-linker")]
#[command(about = "Nix-native JavaScript package manager")]
#[command(version)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Resolve(ResolveArgs),
Build(BuildArgs),
BuildProject(BuildProjectArgs),
Regen(RegenArgs),
CargoUpdate(CargoUpdateArgs),
BuildLibrary(BuildLibraryArgs),
Link(LinkArgs),
BuildLibraries(BuildLibrariesArgs),
BuildNodeModules(BuildNodeModulesArgs),
}
#[derive(Parser, Debug)]
pub struct ResolveArgs {
#[arg(long, default_value = ".")]
pub project: PathBuf,
#[arg(long)]
pub output: Option<PathBuf>,
#[arg(long, default_value_t = true)]
pub include_dev: bool,
#[arg(long, default_value = "https://registry.npmjs.org")]
pub registry: String,
#[arg(long, default_value = "linux")]
pub platform: String,
}
#[derive(Parser, Debug, Clone)]
pub struct BuildArgs {
#[arg(long)]
pub manifest: PathBuf,
#[arg(long)]
pub output: PathBuf,
#[arg(long)]
pub node_bin: PathBuf,
}
pub fn parse_workspace_dep(s: &str) -> Result<(String, PathBuf), String> {
let parts: Vec<&str> = s.splitn(2, '=').collect();
if parts.len() != 2 {
return Err(format!(
"Invalid workspace-dep format: '{}'. Expected 'name=path'",
s
));
}
Ok((parts[0].to_string(), PathBuf::from(parts[1])))
}
#[derive(Debug, Clone)]
pub struct WorkspaceSrc {
pub name: String,
pub manifest: PathBuf,
pub src: PathBuf,
}
pub fn parse_workspace_src(s: &str) -> Result<WorkspaceSrc, String> {
let parts: Vec<&str> = s.splitn(3, '=').collect();
if parts.len() != 3 {
return Err(format!(
"Invalid workspace-src format: '{}'. Expected 'name=manifest=srcPath'",
s
));
}
Ok(WorkspaceSrc {
name: parts[0].to_string(),
manifest: PathBuf::from(parts[1]),
src: PathBuf::from(parts[2]),
})
}
#[derive(Parser, Debug)]
pub struct BuildProjectArgs {
#[arg(long)]
pub manifest: PathBuf,
#[arg(long)]
pub project: PathBuf,
#[arg(long)]
pub output: PathBuf,
#[arg(long)]
pub node_bin: PathBuf,
#[arg(long)]
pub cli_entry: Option<String>,
#[arg(long)]
pub bin_name: Option<String>,
#[arg(long)]
pub parent_tsconfig: Option<PathBuf>,
#[arg(long, value_parser = parse_workspace_dep)]
pub workspace_dep: Vec<(String, PathBuf)>,
#[arg(long, value_parser = parse_workspace_src)]
pub workspace_src: Vec<WorkspaceSrc>,
#[arg(long, default_value_t = false)]
pub use_vite: bool,
}
#[derive(Parser, Debug)]
pub struct RegenArgs {
#[arg(long)]
pub project_root: PathBuf,
#[arg(long)]
pub crate2nix: PathBuf,
}
#[derive(Parser, Debug)]
pub struct CargoUpdateArgs {
#[arg(long)]
pub project_root: PathBuf,
#[arg(long)]
pub cargo: PathBuf,
}
#[derive(Parser, Debug)]
pub struct BuildLibraryArgs {
#[arg(long)]
pub manifest: PathBuf,
#[arg(long)]
pub src: PathBuf,
#[arg(long)]
pub output: PathBuf,
#[arg(long)]
pub node_bin: PathBuf,
}
#[derive(Parser, Debug)]
pub struct LinkArgs {
#[arg(long)]
pub libraries_dir: PathBuf,
#[arg(long)]
pub node_modules: PathBuf,
}
#[derive(Parser, Debug)]
pub struct BuildLibrariesArgs {
#[arg(long)]
pub libraries_dir: PathBuf,
#[arg(long)]
pub node_bin: PathBuf,
}
#[derive(Parser, Debug)]
pub struct BuildNodeModulesArgs {
#[arg(long)]
pub manifest: PathBuf,
#[arg(long)]
pub output: PathBuf,
#[arg(long)]
pub node_bin: PathBuf,
}