use std::path::PathBuf;
use miette::Diagnostic;
use node_semver::Version;
use oro_common::CorgiVersionMetadata;
use oro_package_spec::PackageSpec;
use thiserror::Error;
#[derive(Error, Debug, Diagnostic)]
pub enum NassunError {
#[error("Package for `{0}` was found, but resolved version `{1}` does not exist.")]
#[diagnostic(
code(nassun::missing_version),
url(docsrs),
help("Try using `oro view` to see what versions are available")
)]
MissingVersion(PackageSpec, Version),
#[error(transparent)]
#[diagnostic(transparent)]
PackageSpecError(#[from] oro_package_spec::PackageSpecError),
#[error("{0}")]
#[diagnostic(code(nassun::dir::read), url(docsrs))]
DirReadError(#[source] std::io::Error, PathBuf),
#[error("Failed to execute git subprocess. {0}")]
#[diagnostic(code(nassun::git::clone::io), url(docsrs))]
GitIoError(#[source] std::io::Error),
#[error("Failed to clone repository at `{0}`")]
#[diagnostic(code(nassun::git::clone::repo), url(docsrs))]
GitCloneError(String),
#[error("Failed to check out `{0}#{1}`")]
#[diagnostic(code(nassun::git::checkout::repo), url(docsrs))]
GitCheckoutError(String, String),
#[error("Failed to extract tarball while {2}{}", if let Some(path) = .1 {
format!(" (file: {})", path.to_string_lossy())
} else {
"".to_string()
})]
#[diagnostic(code(nassun::io::extract), url(docsrs))]
ExtractIoError(#[source] std::io::Error, Option<PathBuf>, String),
#[cfg(not(target_arch = "wasm32"))]
#[error("Failed to extract tarball to cache. {0}{}", if let Some(path) = .1 {
format!(" (file: {})", path.to_string_lossy())
} else {
"".to_string()
})]
#[diagnostic(code(nassun::cache::extract), url(docsrs))]
ExtractCacheError(#[source] cacache::Error, Option<PathBuf>),
#[error(transparent)]
#[diagnostic(code(nassun::io::generic), url(docsrs))]
IoError(#[from] std::io::Error),
#[error(transparent)]
#[diagnostic(transparent)]
OroClientError(#[from] oro_client::OroClientError),
#[error(transparent)]
#[diagnostic(code(nassun::serde), url(docsrs))]
SerdeError(#[from] serde_json::Error),
#[error(transparent)]
#[diagnostic(code(nassun::bad_url), url(docsrs))]
UrlError(#[from] url::ParseError),
#[error(transparent)]
#[diagnostic(code(nassun::integrity_parse_error), url(docsrs))]
IntegrityError(#[from] ssri::Error),
#[error("Package metadata for {0} is missing a package tarball URL.")]
#[diagnostic(code(nassun::no_tarball), url(docsrs))]
NoTarball(String, PackageSpec, Box<CorgiVersionMetadata>),
#[error("No matching `{name}` version found for spec `{spec}`.")]
#[diagnostic(
code(resolver::no_matching_version),
url(docsrs),
help("Try using `oro view` to see what versions are available")
)]
NoVersion {
name: String,
spec: PackageSpec,
versions: Vec<String>,
},
#[cfg(target_arch = "wasm32")]
#[error(transparent)]
#[diagnostic(code(node_maintainer::serde_wasm_bindgen::error), url(docsrs))]
SerdeWasmBindgenError(#[from] serde_wasm_bindgen::Error),
#[cfg(not(target_arch = "wasm32"))]
#[error(transparent)]
#[diagnostic(
code(nassun::which_git_failure),
url(docsrs),
help("Are you sure git is installed and available in your $PATH?")
)]
WhichGit(#[from] which::Error),
#[error("Only Version, Tag, Range, and Alias package specs are supported, but got `{0}`.")]
#[diagnostic(code(nassun::invalid_package_spec), url(docsrs))]
InvalidPackageSpec(PackageSpec),
#[error("Unsupported dummy package operation: {0}")]
#[diagnostic(code(nassun::unsupported_dummy_operation), url(docsrs))]
UnsupportedDummyOperation(String),
#[error("Dummy package does not have a name.")]
#[diagnostic(code(nassun::dummy_no_name), url(docsrs))]
DummyNoName,
#[error("{0}")]
#[diagnostic(code(nassun::misc), url(docsrs))]
MiscError(String),
}
pub type Result<T> = std::result::Result<T, NassunError>;