use std::fmt::{self, Display, Formatter};
use thiserror::Error;
pub(crate) fn with_io_context(
additional: impl Display,
context: impl Display,
error: impl Into<std::io::Error>,
) -> Error {
Error {
kind: ErrorKind::Io {
error: error.into(),
additional: additional.to_string(),
},
context: context.to_string(),
}
}
pub type Result<T, E = Error> = std::result::Result<T, E>;
#[derive(Debug)]
pub struct Error {
pub kind: ErrorKind,
pub context: String,
}
impl std::error::Error for Error {
fn cause(&self) -> Option<&dyn std::error::Error> {
self.kind.source()
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "encountered {} during {}", self.kind, self.context)
}
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ErrorKind {
#[error("{error} ({additional})")]
Io {
error: std::io::Error,
additional: String,
},
#[error("non-relative path {0}")]
NonRelativePath(std::path::PathBuf),
#[cfg(feature = "opencode")]
#[error("{0}")]
InvalidOpencodeConfigSyntax(jsonc_parser::errors::ParseError),
#[cfg(feature = "opencode")]
#[error("{0}")]
InvalidOpencodeConfigSchema(String),
#[cfg(feature = "zed")]
#[error("{0}")]
InvalidZedConfigSyntax(jsonc_parser::errors::ParseError),
#[cfg(feature = "zed")]
#[error("{0}")]
InvalidZedConfigSchema(String),
}