use std::error::Error;
use std::fmt;
use std::ffi::NulError;
#[derive(Debug)]
pub enum GraphvizError {
GraphCreationFailed,
NodeCreationFailed,
EdgeCreationFailed,
LayoutFailed,
RenderFailed,
InvalidString,
AttributeSetFailed,
AttributeGetFailed,
FreeLayoutFailed,
InvalidUtf8,
NullPointer(&'static str),
ContextCreationFailed,
InvalidFormat,
InvalidEngine,
InitializationFailed,
CleanupFailed,
SystemError(i32),
IoError(std::io::Error),
}
impl fmt::Display for GraphvizError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
GraphvizError::GraphCreationFailed => write!(f, "Failed to create graph"),
GraphvizError::NodeCreationFailed => write!(f, "Failed to create node"),
GraphvizError::EdgeCreationFailed => write!(f, "Failed to create edge"),
GraphvizError::LayoutFailed => write!(f, "Failed to compute layout"),
GraphvizError::RenderFailed => write!(f, "Failed to render graph"),
GraphvizError::InvalidString => write!(f, "String contains null bytes"),
GraphvizError::AttributeSetFailed => write!(f, "Failed to set attribute"),
GraphvizError::AttributeGetFailed => write!(f, "Failed to get attribute"),
GraphvizError::FreeLayoutFailed => write!(f, "Failed to free layout resources"),
GraphvizError::InvalidUtf8 => write!(f, "String is not valid UTF-8"),
GraphvizError::NullPointer(context) => write!(f, "Null pointer encountered: {}", context),
GraphvizError::ContextCreationFailed => write!(f, "Failed to create GraphViz context"),
GraphvizError::InvalidFormat => write!(f, "Invalid output format specified"),
GraphvizError::InvalidEngine => write!(f, "Invalid layout engine specified"),
GraphvizError::InitializationFailed => write!(f, "Failed to initialize GraphViz"),
GraphvizError::CleanupFailed => write!(f, "Failed to clean up GraphViz resources"),
GraphvizError::SystemError(errno) => write!(f, "System error occurred (errno: {})", errno),
GraphvizError::IoError(err) => write!(f, "I/O error: {}", err),
}
}
}
impl Error for GraphvizError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
GraphvizError::IoError(err) => Some(err),
_ => None,
}
}
}
impl From<NulError> for GraphvizError {
fn from(_: NulError) -> Self {
GraphvizError::InvalidString
}
}
impl From<std::io::Error> for GraphvizError {
fn from(err: std::io::Error) -> Self {
GraphvizError::IoError(err)
}
}
impl From<std::str::Utf8Error> for GraphvizError {
fn from(_: std::str::Utf8Error) -> Self {
GraphvizError::InvalidUtf8
}
}