1use std::any::Any;
4use tower_lsp_server::ls_types::Range;
5
6pub use deps_maven::MavenVersion as GradleVersion;
7
8#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct GradleDependency {
10 pub group_id: String,
11 pub artifact_id: String,
12 pub name: String,
14 pub name_range: Range,
15 pub version_req: Option<String>,
16 pub version_range: Option<Range>,
17 pub configuration: String,
19}
20
21impl deps_core::DependencyInfo for GradleDependency {
22 fn name(&self) -> &str {
23 &self.name
24 }
25
26 fn name_range(&self) -> Range {
27 self.name_range
28 }
29
30 fn version_requirement(&self) -> Option<&str> {
31 self.version_req.as_deref()
32 }
33
34 fn version_range(&self) -> Option<Range> {
35 self.version_range
36 }
37
38 fn source(&self) -> deps_core::parser::DependencySource {
39 deps_core::parser::DependencySource::Registry
40 }
41
42 fn features(&self) -> &[String] {
43 &[]
44 }
45}
46
47impl deps_core::Dependency for GradleDependency {
48 fn name(&self) -> &str {
49 &self.name
50 }
51
52 fn name_range(&self) -> Range {
53 self.name_range
54 }
55
56 fn version_requirement(&self) -> Option<&str> {
57 self.version_req.as_deref()
58 }
59
60 fn version_range(&self) -> Option<Range> {
61 self.version_range
62 }
63
64 fn source(&self) -> deps_core::parser::DependencySource {
65 deps_core::parser::DependencySource::Registry
66 }
67
68 fn features(&self) -> &[String] {
69 &[]
70 }
71
72 fn as_any(&self) -> &dyn Any {
73 self
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80 use tower_lsp_server::ls_types::Position;
81
82 fn test_dep() -> GradleDependency {
83 GradleDependency {
84 group_id: "org.springframework.boot".into(),
85 artifact_id: "spring-boot-starter".into(),
86 name: "org.springframework.boot:spring-boot-starter".into(),
87 name_range: Range::new(Position::new(5, 4), Position::new(5, 30)),
88 version_req: Some("3.2.0".into()),
89 version_range: Some(Range::new(Position::new(5, 35), Position::new(5, 40))),
90 configuration: "implementation".into(),
91 }
92 }
93
94 #[test]
95 fn test_dependency_trait() {
96 use deps_core::Dependency;
97
98 let dep = test_dep();
99 assert_eq!(dep.name(), "org.springframework.boot:spring-boot-starter");
100 assert_eq!(dep.version_requirement(), Some("3.2.0"));
101 assert!(dep.features().is_empty());
102 assert!(dep.as_any().is::<GradleDependency>());
103 assert!(matches!(
104 dep.source(),
105 deps_core::parser::DependencySource::Registry
106 ));
107 }
108
109 #[test]
110 fn test_dependency_info_trait() {
111 use deps_core::DependencyInfo;
112
113 let dep = test_dep();
114 assert_eq!(dep.name(), "org.springframework.boot:spring-boot-starter");
115 assert!(dep.version_range().is_some());
116 assert!(matches!(
117 dep.source(),
118 deps_core::parser::DependencySource::Registry
119 ));
120 }
121
122 #[test]
123 fn test_dependency_without_version() {
124 use deps_core::Dependency;
125
126 let dep = GradleDependency {
127 group_id: "com.example".into(),
128 artifact_id: "test".into(),
129 name: "com.example:test".into(),
130 name_range: Range::default(),
131 version_req: None,
132 version_range: None,
133 configuration: "api".into(),
134 };
135 assert!(dep.version_requirement().is_none());
136 assert!(dep.version_range().is_none());
137 }
138}