#![forbid(unsafe_code)]
use std::io;
use std::path::PathBuf;
use crate::contracts::PluginKind;
#[derive(Debug, thiserror::Error)]
pub enum PluginError {
#[error("plugin manifest parse failed: {0}")]
ManifestParse(String),
#[error("plugin manifest field invalid: {0}")]
InvalidField(String),
#[error("plugin namespace is invalid: {0}")]
InvalidNamespace(String),
#[error("plugin namespace is reserved: {0}")]
ReservedNamespace(String),
#[error("plugin namespace collides with core namespace: {0}")]
CoreNamespaceConflict(String),
#[error("plugin namespace collides with reserved product namespace: {0}")]
FutureNamespaceConflict(String),
#[error("plugin manifest contains duplicate alias: {0}")]
DuplicateAlias(String),
#[error("plugin alias is invalid: {0}")]
InvalidAlias(String),
#[error("plugin alias is reserved: {0}")]
ReservedAlias(String),
#[error("plugin alias conflicts with plugin namespace: {0}")]
AliasNamespaceConflict(String),
#[error("plugin alias conflicts with installed plugin: {0}")]
AliasConflict(String),
#[error("plugin is incompatible with host version {host_version}")]
IncompatibleVersion {
host_version: String,
},
#[error("plugin entrypoint is invalid for kind {kind:?}")]
InvalidEntrypoint {
kind: PluginKind,
},
#[error("plugin entrypoint was not found at {path}")]
MissingEntrypointPath {
kind: PluginKind,
path: PathBuf,
},
#[error("plugin entrypoint is not executable: {path}")]
NonExecutableEntrypoint {
path: PathBuf,
},
#[error("plugin kind is not supported in current runtime: {0:?}")]
UnsupportedKind(PluginKind),
#[error("plugin namespace already installed: {0}")]
NamespaceConflict(String),
#[error("plugin registry is corrupted")]
RegistryCorrupted,
#[error("plugin not found: {0}")]
PluginNotFound(String),
#[error("plugin registry lock is held at {0}")]
RegistryLocked(PathBuf),
#[error("plugin is missing required capability: {0}")]
MissingCapability(String),
#[error(transparent)]
Io(#[from] io::Error),
#[error(transparent)]
Json(#[from] serde_json::Error),
}