use crate::application::error::ApplicationError;
use crate::domain::error::DomainError;
use serde_json::{json, Value};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum LspError {
#[error("Not found: {0}")]
NotFound(String),
#[error("Invalid input: {0}")]
InvalidInput(String),
#[error("Database error: {0}")]
DatabaseError(String),
#[error("Domain error: {0}")]
Domain(#[from] DomainError),
#[error("Application error: {0}")]
Application(#[from] ApplicationError),
#[error("Internal error: {0}")]
Internal(String),
}
impl LspError {
pub fn context<C: Into<String>>(self, context: C) -> Self {
match self {
LspError::Internal(msg) => LspError::Internal(format!("{}: {}", context.into(), msg)),
LspError::Domain(err) => LspError::Domain(err.context(context)),
LspError::Application(err) => LspError::Application(err.context(context)),
err => LspError::Internal(format!("{}: {}", context.into(), err)),
}
}
pub fn to_lsp_response(&self) -> Value {
let (code, message) = match self {
LspError::NotFound(msg) => (-32001, msg.clone()),
LspError::InvalidInput(msg) => (-32602, msg.clone()),
LspError::DatabaseError(msg) => (-32002, msg.clone()),
LspError::Domain(err) => (-32003, err.to_string()),
LspError::Application(err) => (-32004, err.to_string()),
LspError::Internal(msg) => (-32603, msg.clone()),
};
json!({
"success": false,
"error": {
"code": code,
"message": message
}
})
}
}
pub type LspResult<T> = Result<T, LspError>;