use std::fmt;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
Config(ConfigError),
Discovery(DiscoveryError),
Parser(ParserError),
Resolver(ResolverError),
Lsp(LspError),
InvalidPath(String),
Io(std::io::Error),
Other(String),
}
#[derive(Debug)]
pub enum ConfigError {
EnvVarNotFound(String),
InvalidPath(String),
NoValidPaths,
ValidationFailed(String),
}
#[derive(Debug)]
pub enum DiscoveryError {
ScanFailed(String),
PackageNotFound(String),
InvalidStructure(String),
CacheFailed(String),
}
#[derive(Debug)]
pub enum ParserError {
ReadFailed(String),
InvalidSyntax(String),
MissingField(String),
InvalidValue(String),
}
#[derive(Debug)]
pub enum ResolverError {
Conflict(String),
CircularDependency(String),
UnsatisfiableConstraint(String),
PackageNotFound(String),
}
#[derive(Debug)]
pub enum LspError {
InvalidRequest(String),
NotInitialized,
Internal(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Config(e) => write!(f, "Configuration error: {}", e),
Error::Discovery(e) => write!(f, "Discovery error: {}", e),
Error::Parser(e) => write!(f, "Parser error: {}", e),
Error::Resolver(e) => write!(f, "Resolver error: {}", e),
Error::Lsp(e) => write!(f, "LSP error: {}", e),
Error::InvalidPath(path) => write!(f, "Invalid path: {}", path),
Error::Io(e) => write!(f, "I/O error: {}", e),
Error::Other(msg) => write!(f, "Error: {}", msg),
}
}
}
impl fmt::Display for ConfigError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ConfigError::EnvVarNotFound(var) => {
write!(f, "Environment variable not found: {}", var)
}
ConfigError::InvalidPath(path) => write!(f, "Invalid path: {}", path),
ConfigError::NoValidPaths => write!(f, "No valid package paths found"),
ConfigError::ValidationFailed(msg) => write!(f, "Validation failed: {}", msg),
}
}
}
impl fmt::Display for DiscoveryError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DiscoveryError::ScanFailed(path) => write!(f, "Failed to scan directory: {}", path),
DiscoveryError::PackageNotFound(name) => write!(f, "Package not found: {}", name),
DiscoveryError::InvalidStructure(msg) => {
write!(f, "Invalid package structure: {}", msg)
}
DiscoveryError::CacheFailed(msg) => write!(f, "Cache operation failed: {}", msg),
}
}
}
impl fmt::Display for ParserError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ParserError::ReadFailed(path) => write!(f, "Failed to read file: {}", path),
ParserError::InvalidSyntax(msg) => write!(f, "Invalid syntax: {}", msg),
ParserError::MissingField(field) => write!(f, "Missing required field: {}", field),
ParserError::InvalidValue(msg) => write!(f, "Invalid field value: {}", msg),
}
}
}
impl fmt::Display for ResolverError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ResolverError::Conflict(msg) => write!(f, "Dependency conflict: {}", msg),
ResolverError::CircularDependency(msg) => write!(f, "Circular dependency: {}", msg),
ResolverError::UnsatisfiableConstraint(msg) => {
write!(f, "Unsatisfiable constraint: {}", msg)
}
ResolverError::PackageNotFound(name) => {
write!(f, "Package not found during resolution: {}", name)
}
}
}
}
impl fmt::Display for LspError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
LspError::InvalidRequest(msg) => write!(f, "Invalid request: {}", msg),
LspError::NotInitialized => write!(f, "Server not initialized"),
LspError::Internal(msg) => write!(f, "Internal server error: {}", msg),
}
}
}
impl std::error::Error for Error {}
impl std::error::Error for ConfigError {}
impl std::error::Error for DiscoveryError {}
impl std::error::Error for ParserError {}
impl std::error::Error for ResolverError {}
impl std::error::Error for LspError {}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Error::Io(err)
}
}
impl From<ConfigError> for Error {
fn from(err: ConfigError) -> Self {
Error::Config(err)
}
}
impl From<DiscoveryError> for Error {
fn from(err: DiscoveryError) -> Self {
Error::Discovery(err)
}
}
impl From<ParserError> for Error {
fn from(err: ParserError) -> Self {
Error::Parser(err)
}
}
impl From<ResolverError> for Error {
fn from(err: ResolverError) -> Self {
Error::Resolver(err)
}
}
impl From<LspError> for Error {
fn from(err: LspError) -> Self {
Error::Lsp(err)
}
}
impl From<regex::Error> for Error {
fn from(err: regex::Error) -> Self {
Error::Parser(ParserError::InvalidSyntax(err.to_string()))
}
}