Skip to main content

deps_gradle/
error.rs

1//! Errors specific to Gradle dependency handling.
2
3use thiserror::Error;
4
5#[derive(Error, Debug)]
6pub enum GradleError {
7    #[error("Failed to parse Gradle file: {message}")]
8    ParseError { message: String },
9
10    #[error("Invalid Gradle dependency format: {message}")]
11    InvalidDependency { message: String },
12
13    #[error(transparent)]
14    Maven(#[from] deps_maven::MavenError),
15
16    #[error("I/O error: {0}")]
17    Io(#[from] std::io::Error),
18}
19
20pub type Result<T> = std::result::Result<T, GradleError>;
21
22impl From<GradleError> for deps_core::DepsError {
23    fn from(err: GradleError) -> Self {
24        match err {
25            GradleError::ParseError { message } => Self::ParseError {
26                file_type: "Gradle".into(),
27                source: Box::new(std::io::Error::other(message)),
28            },
29            GradleError::InvalidDependency { message } => Self::InvalidVersionReq(message),
30            GradleError::Maven(e) => e.into(),
31            GradleError::Io(e) => Self::Io(e),
32        }
33    }
34}
35
36impl From<deps_core::DepsError> for GradleError {
37    fn from(err: deps_core::DepsError) -> Self {
38        match err {
39            deps_core::DepsError::ParseError { source, .. } => Self::ParseError {
40                message: source.to_string(),
41            },
42            deps_core::DepsError::CacheError(msg) => Self::ParseError { message: msg },
43            deps_core::DepsError::InvalidVersionReq(msg) => {
44                Self::InvalidDependency { message: msg }
45            }
46            deps_core::DepsError::Io(e) => Self::Io(e),
47            other => Self::ParseError {
48                message: other.to_string(),
49            },
50        }
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn test_parse_error_display() {
60        let err = GradleError::ParseError {
61            message: "syntax error".into(),
62        };
63        assert!(err.to_string().contains("syntax error"));
64    }
65
66    #[test]
67    fn test_invalid_dependency_display() {
68        let err = GradleError::InvalidDependency {
69            message: "bad format".into(),
70        };
71        assert!(err.to_string().contains("bad format"));
72    }
73
74    #[test]
75    fn test_conversion_to_deps_error() {
76        let err = GradleError::ParseError {
77            message: "test".into(),
78        };
79        let deps_err: deps_core::DepsError = err.into();
80        assert!(matches!(deps_err, deps_core::DepsError::ParseError { .. }));
81    }
82
83    #[test]
84    fn test_invalid_dep_to_deps_error() {
85        let err = GradleError::InvalidDependency {
86            message: "bad".into(),
87        };
88        let deps_err: deps_core::DepsError = err.into();
89        assert!(matches!(
90            deps_err,
91            deps_core::DepsError::InvalidVersionReq(_)
92        ));
93    }
94
95    #[test]
96    fn test_io_error_conversion() {
97        let io_err = std::io::Error::from(std::io::ErrorKind::NotFound);
98        let err: GradleError = io_err.into();
99        assert!(matches!(err, GradleError::Io(_)));
100        let deps_err: deps_core::DepsError = err.into();
101        assert!(matches!(deps_err, deps_core::DepsError::Io(_)));
102    }
103
104    #[test]
105    fn test_deps_error_to_gradle_error() {
106        let deps_err = deps_core::DepsError::CacheError("cache miss".into());
107        let gradle_err: GradleError = deps_err.into();
108        assert!(matches!(gradle_err, GradleError::ParseError { .. }));
109    }
110}