1use thiserror::Error;
4
5#[derive(Error, Debug)]
7pub enum ComposerError {
8 #[error("Failed to parse composer.json: {source}")]
10 JsonParseError {
11 #[source]
12 source: serde_json::Error,
13 },
14
15 #[error("Package '{package}' not found on Packagist")]
17 PackageNotFound { package: String },
18
19 #[error("Packagist registry request failed for '{package}': {source}")]
21 RegistryError {
22 package: String,
23 #[source]
24 source: Box<dyn std::error::Error + Send + Sync>,
25 },
26
27 #[error("I/O error: {0}")]
29 Io(#[from] std::io::Error),
30}
31
32pub type Result<T> = std::result::Result<T, ComposerError>;
34
35impl From<ComposerError> for deps_core::DepsError {
36 fn from(err: ComposerError) -> Self {
37 match err {
38 ComposerError::JsonParseError { source } => Self::Json(source),
39 ComposerError::PackageNotFound { package } => {
40 Self::CacheError(format!("Package '{package}' not found"))
41 }
42 ComposerError::RegistryError { package, source } => Self::ParseError {
43 file_type: format!("Packagist registry for {package}"),
44 source,
45 },
46 ComposerError::Io(e) => Self::Io(e),
47 }
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
56 fn test_error_display() {
57 let err = ComposerError::PackageNotFound {
58 package: "vendor/package".into(),
59 };
60 assert_eq!(
61 err.to_string(),
62 "Package 'vendor/package' not found on Packagist"
63 );
64 }
65
66 #[test]
67 fn test_conversion_to_deps_error() {
68 let err = ComposerError::PackageNotFound {
69 package: "test/pkg".into(),
70 };
71 let deps_err: deps_core::DepsError = err.into();
72 assert!(deps_err.to_string().contains("not found"));
73 }
74}