use super::common::{PackageError, run_install_loop};
use super::config::GoConfig;
pub struct GoHandler {
config: GoConfig,
}
impl GoHandler {
pub fn new(config: GoConfig) -> Self {
Self { config }
}
pub fn install(&self) -> Result<(), PackageError> {
run_install_loop(
"go",
"go",
"[go]",
"No go packages configured",
&self.config.packages,
|name, spec| {
Ok(vec![
"install".to_string(),
build_module_spec(name, spec.version()),
])
},
)
}
}
pub(crate) fn build_module_spec(name: &str, version: &str) -> String {
if version == "latest" {
format!("{name}@latest")
} else {
format!("{name}@{version}")
}
}
#[cfg(test)]
mod tests {
use super::super::config::PackageSpec;
use super::*;
use std::collections::HashMap;
#[test]
fn go_handler_empty() {
let config = GoConfig::default();
let handler = GoHandler::new(config);
assert!(handler.config.packages.is_empty());
}
#[test]
fn go_handler_holds_packages() {
let mut packages = HashMap::new();
packages.insert(
"github.com/golangci/golangci-lint/cmd/golangci-lint".to_string(),
PackageSpec::Version("latest".to_string()),
);
packages.insert(
"github.com/cosmtrek/air".to_string(),
PackageSpec::Version("v1.49.0".to_string()),
);
let config = GoConfig { packages };
let handler = GoHandler::new(config);
assert_eq!(handler.config.packages.len(), 2);
}
#[test]
fn build_module_spec_table() {
assert_eq!(
build_module_spec("github.com/cosmtrek/air", "latest"),
"github.com/cosmtrek/air@latest"
);
assert_eq!(
build_module_spec("golang.org/x/tools/gopls", "v0.15.0"),
"golang.org/x/tools/gopls@v0.15.0"
);
}
#[test]
fn go_rejects_flag_like_names() {
use super::super::common::validate_package_name;
let err = validate_package_name("--mod", "[go]")
.expect_err("flag-like module path must be refused");
assert!(matches!(err, PackageError::RefusedUnsafeSpec(_, _)));
}
}