1use anyhow::Result;
4use colored::Colorize;
5
6use crate::pkg::{pin, resolve};
7
8pub fn run(source: &str, version: &str) -> Result<()> {
18 let (pkg, _, _, _, _registry_handle, _, _) =
19 resolve::resolve_package_and_version(source, None, false, false)?;
20 let mut pinned_packages = pin::get_pinned_packages()?;
21
22 if pinned_packages.iter().any(|p| p.source == pkg.name) {
23 println!(
24 "Package '{}' is already pinned. Unpin it first to change the \
25 version.",
26 pkg.name
27 );
28 return Ok(());
29 }
30
31 let new_pin = pin::PinnedPackage {
32 source: pkg.name.clone(),
33 version: version.to_string()
34 };
35 pinned_packages.push(new_pin);
36 pin::write_pinned_packages(&pinned_packages)?;
37
38 println!("Pinned {}@{}", pkg.name.green(), version.yellow());
39 Ok(())
40}