Skip to main content

deps_gradle/
types.rs

1//! Domain types for Gradle dependencies.
2
3use 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    /// Canonical identifier: "{groupId}:{artifactId}"
13    pub name: String,
14    pub name_range: Range,
15    pub version_req: Option<String>,
16    pub version_range: Option<Range>,
17    /// Gradle configuration (e.g. "implementation", "api", "testImplementation")
18    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}