1use 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}