use thiserror::Error;
#[derive(Error, Debug)]
pub enum ArchToolkitError {
#[error("Network error: {0}")]
Network(reqwest::Error),
#[error("AUR search failed for query '{query}': {source}")]
SearchFailed {
query: String,
#[source]
source: reqwest::Error,
},
#[error("AUR info fetch failed for packages [{packages}]: {source}")]
InfoFailed {
packages: String,
#[source]
source: reqwest::Error,
},
#[error("AUR comments fetch failed for package '{package}': {source}")]
CommentsFailed {
package: String,
#[source]
source: reqwest::Error,
},
#[error("PKGBUILD fetch failed for package '{package}': {source}")]
PkgbuildFailed {
package: String,
#[source]
source: reqwest::Error,
},
#[error("JSON parsing error: {0}")]
Json(#[from] serde_json::Error),
#[error("Parse error: {0}")]
Parse(String),
#[error("Rate limited by server{0}", .retry_after.map(|s| format!(" (retry after {s}s)")).unwrap_or_default())]
RateLimited {
retry_after: Option<u64>,
},
#[error("Package '{package}' not found")]
PackageNotFound {
package: String,
},
#[error("Invalid input: {0}")]
InvalidInput(String),
#[error("Empty {field}: {message}")]
EmptyInput {
field: String,
message: String,
},
#[error("Invalid package name '{name}': {reason}")]
InvalidPackageName {
name: String,
reason: String,
},
#[error("Invalid search query: {reason}")]
InvalidSearchQuery {
reason: String,
},
#[error("{field} exceeds maximum length of {max_length} characters (got {actual_length})")]
InputTooLong {
field: String,
max_length: usize,
actual_length: usize,
},
}
impl ArchToolkitError {
#[must_use]
pub fn search_failed(query: impl Into<String>, source: reqwest::Error) -> Self {
Self::SearchFailed {
query: query.into(),
source,
}
}
#[must_use]
pub fn info_failed(packages: &[&str], source: reqwest::Error) -> Self {
Self::InfoFailed {
packages: packages.join(", "),
source,
}
}
#[must_use]
pub fn comments_failed(package: impl Into<String>, source: reqwest::Error) -> Self {
Self::CommentsFailed {
package: package.into(),
source,
}
}
#[must_use]
pub fn pkgbuild_failed(package: impl Into<String>, source: reqwest::Error) -> Self {
Self::PkgbuildFailed {
package: package.into(),
source,
}
}
}
pub type Result<T> = std::result::Result<T, ArchToolkitError>;