Skip to main content

deps_composer/
error.rs

1//! Errors specific to PHP/Composer dependency handling.
2
3use thiserror::Error;
4
5/// Errors specific to PHP/Composer dependency handling.
6#[derive(Error, Debug)]
7pub enum ComposerError {
8    /// Failed to parse composer.json
9    #[error("Failed to parse composer.json: {source}")]
10    JsonParseError {
11        #[source]
12        source: serde_json::Error,
13    },
14
15    /// Package not found on Packagist
16    #[error("Package '{package}' not found on Packagist")]
17    PackageNotFound { package: String },
18
19    /// Packagist registry request failed
20    #[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    /// I/O error
28    #[error("I/O error: {0}")]
29    Io(#[from] std::io::Error),
30}
31
32/// Result type alias for Composer operations.
33pub 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}