use std::path::{Path, PathBuf};
use crate::types::{Task, TaskSource};
pub(crate) const fn flat_source_label(source: TaskSource) -> &'static str {
source.label()
}
pub(crate) const fn structured_source_label(source: TaskSource) -> &'static str {
match source {
TaskSource::CargoAliases => "cargo-alias",
_ => flat_source_label(source),
}
}
pub(crate) fn fqn(source: TaskSource, name: &str) -> String {
format!("root:{kind}#{name}", kind = structured_source_label(source))
}
pub(crate) fn source_pointer(task: &Task) -> Option<String> {
let name = &task.name;
match task.source {
TaskSource::CargoAliases => Some(format!("alias.{name}")),
TaskSource::PackageJson => Some(format!("scripts.{name}")),
TaskSource::DenoJson
| TaskSource::TurboJson
| TaskSource::Taskfile
| TaskSource::MiseToml => Some(format!("tasks.{name}")),
TaskSource::BaconToml => Some(format!("jobs.{name}")),
TaskSource::PyprojectScripts => Some(format!("project.scripts.{name}")),
TaskSource::Makefile | TaskSource::Justfile => Some(name.clone()),
TaskSource::GoPackage => None,
}
}
pub(crate) fn source_anchor(source: TaskSource, root: &Path) -> Option<PathBuf> {
use crate::tool;
match source {
TaskSource::PackageJson => tool::node::find_manifest_upwards(root),
TaskSource::DenoJson => tool::deno::find_config_upwards(root),
TaskSource::TurboJson => tool::turbo::find_config(root),
TaskSource::Makefile => tool::files::find_first(root, tool::make::FILENAMES),
TaskSource::Justfile => tool::just::find_file(root),
TaskSource::Taskfile => tool::files::find_first(root, tool::go_task::FILENAMES),
TaskSource::CargoAliases => tool::cargo_aliases::find_anchor(root),
TaskSource::GoPackage => tool::go_pm::find_file(root),
TaskSource::BaconToml => tool::files::find_first(root, tool::bacon::FILENAMES),
TaskSource::MiseToml => tool::mise::find_file(root),
TaskSource::PyprojectScripts => tool::python::find_pyproject_upwards(root),
}
}
pub(crate) fn resolved_command(
task: &Task,
node_pm: Option<&str>,
python_pm: Option<&str>,
) -> Option<String> {
let name = &task.name;
match task.source {
TaskSource::CargoAliases => Some(task.alias_of.as_deref().map_or_else(
|| format!("cargo {name}"),
|expansion| format!("cargo {expansion}"),
)),
TaskSource::DenoJson => Some(format!("deno task {name}")),
TaskSource::TurboJson => Some(format!("turbo run {name}")),
TaskSource::Makefile => Some(format!("make {name}")),
TaskSource::Justfile => Some(format!("just {name}")),
TaskSource::Taskfile => Some(format!("task {name}")),
TaskSource::BaconToml => Some(format!("bacon {name}")),
TaskSource::MiseToml => Some(format!("mise run {name}")),
TaskSource::GoPackage => Some(format!(
"go run {target}",
target = task.run_target.as_deref().unwrap_or(name)
)),
TaskSource::PackageJson => node_pm.map(|pm| format!("{pm} run {name}")),
TaskSource::PyprojectScripts => python_pm.map(|pm| format!("{pm} run {name}")),
}
}