use futures::channel::mpsc;
use kdl::{KdlDocument, KdlNode};
use miette::Diagnostic;
use thiserror::Error;
use crate::{NpmPackageLock, NpmPackageLockEntry};
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Error, Diagnostic)]
pub enum NodeMaintainerError {
#[error("Unsupported resolved URL scheme")]
#[diagnostic(code(node_maintainer::kdl::unsupported_url_scheme))]
UnsupportedScheme(String),
#[error("Failed to parse a resolved URL while parsing lockfile: {0}")]
#[diagnostic(code(node_maintainer::kdl::url_parse_error))]
UrlParseError(String, #[source] url::ParseError),
#[error("Failed to parse a Semver string.")]
#[diagnostic(code(node_maintainer::kdl::semver_parse_error))]
SemverParseError(#[from] node_semver::SemverError),
#[error("Missing version for NPM package entry in lockfile.")]
#[diagnostic(code(node_maintainer::kdl::missing_version))]
MissingVersion,
#[error("Missing version for NPM package entry in lockfile.")]
#[diagnostic(code(node_maintainer::kdl::missing_version))]
MissingResolution,
#[error(transparent)]
#[diagnostic(code(node_maintainer::kdl::integrity_parse_error))]
IntegrityParseError(#[from] ssri::Error),
#[error("Failed to parse an integrity value while loading lockfile node:\n{0}")]
#[diagnostic(code(node_maintainer::kdl::integrity_parse_error))]
KdlLockfileIntegrityParseError(KdlNode, #[source] ssri::Error),
#[error("Missing package node name:\n{0}")]
#[diagnostic(code(node_maintainer::kdl::missing_node_name))]
KdlLockMissingName(KdlNode),
#[error("Missing package name:\n{0:#?}")]
#[diagnostic(code(node_maintainer::npm::missing_name))]
NpmLockMissingName(NpmPackageLockEntry),
#[error("Failed to parse an integrity value while loading lockfile node:\n{0:#?}")]
#[diagnostic(code(node_maintainer::npm::integrity_parse_error))]
NpmLockfileIntegrityParseError(NpmPackageLockEntry, #[source] ssri::Error),
#[error("Unsupported NPM Package Lock version: {0}")]
#[diagnostic(code(node_maintainer::npm::unsupported_package_lock_Version))]
NpmUnsupportedPackageLockVersion(u64),
#[error("No root node in KDL lockfile.")]
#[diagnostic(code(node_maintainer::kdl::missing_root))]
KdlLockMissingRoot(KdlDocument),
#[error("No root package in NPM lockfile.")]
#[diagnostic(code(node_maintainer::npm::missing_root))]
NpmLockMissingRoot(NpmPackageLock),
#[error(transparent)]
#[diagnostic(code(node_maintainer::kdl::parse_error))]
KdlParseError(#[from] kdl::KdlError),
#[error("Invalid lockfile version format.")]
#[diagnostic(code(node_maintainer::kdl::invalid_lockfile_version))]
InvalidLockfileVersion,
#[cfg(target_arch = "wasm32")]
#[error(transparent)]
#[diagnostic(code(node_maintainer::serde_wasm_bindgen::error))]
SerdeWasmBindgenError(#[from] serde_wasm_bindgen::Error),
#[error(transparent)]
#[diagnostic(transparent)]
PackageSpecError(#[from] oro_package_spec::PackageSpecError),
#[error(transparent)]
#[diagnostic(code(node_maintainer::io_error))]
IoError(#[from] std::io::Error),
#[error(transparent)]
#[diagnostic(transparent)]
NassunError(#[from] nassun::error::NassunError),
#[error(transparent)]
#[diagnostic(code(node_maintainer::serde_json_error))]
SerdeJsonError(#[from] serde_json::Error),
#[error("{0}")]
#[diagnostic(code(node_maintainer::miscellaneous_error))]
MiscError(String),
#[error("Failed to send data through mpsc channel.")]
#[diagnostic(code(node_maintainer::mpsc_error))]
TrySendError,
#[error("{0}")]
#[diagnostic(code(node_maintainer::graph_error))]
GraphValidationError(String),
#[cfg(not(target_arch = "wasm32"))]
#[error(transparent)]
#[diagnostic(code(node_maintainer::walkdir_error))]
WalkDirError(#[from] walkdir::Error),
#[cfg(not(target_arch = "wasm32"))]
#[error("Failed to read manifest during build step, at {}", .0.display())]
#[diagnostic(code(node_maintainer::build_manifest_read_error))]
BuildManifestReadError(std::path::PathBuf, #[source] std::io::Error),
#[cfg(not(target_arch = "wasm32"))]
#[error(transparent)]
#[diagnostic(transparent)]
OroScriptError(#[from] oro_script::OroScriptError),
}
impl<T> From<mpsc::TrySendError<T>> for NodeMaintainerError {
fn from(_: mpsc::TrySendError<T>) -> Self {
NodeMaintainerError::TrySendError
}
}