1use deps_core::lsp_helpers::EcosystemFormatter;
2
3pub struct CargoFormatter;
4
5impl EcosystemFormatter for CargoFormatter {
6 fn format_version_for_code_action(&self, version: &str) -> String {
7 format!("\"{version}\"")
8 }
9
10 fn package_url(&self, name: &str) -> String {
11 format!("https://crates.io/crates/{name}")
12 }
13}
14
15#[cfg(test)]
16mod tests {
17 use super::*;
18
19 #[test]
20 fn test_format_version() {
21 let formatter = CargoFormatter;
22 assert_eq!(
23 formatter.format_version_for_code_action("1.0.214"),
24 "\"1.0.214\""
25 );
26 assert_eq!(
27 formatter.format_version_for_code_action("0.1.0"),
28 "\"0.1.0\""
29 );
30 }
31
32 #[test]
33 fn test_package_url() {
34 let formatter = CargoFormatter;
35 assert_eq!(
36 formatter.package_url("serde"),
37 "https://crates.io/crates/serde"
38 );
39 assert_eq!(
40 formatter.package_url("tokio-util"),
41 "https://crates.io/crates/tokio-util"
42 );
43 }
44
45 #[test]
46 fn test_default_normalize_is_identity() {
47 let formatter = CargoFormatter;
48 assert_eq!(formatter.normalize_package_name("serde"), "serde");
49 assert_eq!(formatter.normalize_package_name("tokio-util"), "tokio-util");
50 }
51
52 #[test]
53 fn test_default_yanked_message() {
54 let formatter = CargoFormatter;
55 assert_eq!(formatter.yanked_message(), "This version has been yanked");
56 assert_eq!(formatter.yanked_label(), "*(yanked)*");
57 }
58
59 #[test]
60 fn test_version_satisfies_requirement() {
61 let formatter = CargoFormatter;
62
63 assert!(formatter.version_satisfies_requirement("1.2.3", "1.2.3"));
64 assert!(formatter.version_satisfies_requirement("1.2.3", "^1.2"));
65 assert!(formatter.version_satisfies_requirement("1.2.3", "~1.2"));
66 assert!(formatter.version_satisfies_requirement("1.2.3", "1"));
67 assert!(formatter.version_satisfies_requirement("1.2.3", "1.2"));
68
69 assert!(!formatter.version_satisfies_requirement("1.2.3", "2.0.0"));
70 assert!(!formatter.version_satisfies_requirement("1.2.3", "1.3"));
71 }
72}