use miette::Diagnostic;
use thiserror::Error;
#[derive(Error, Debug, Diagnostic)]
pub enum GenError {
#[error("Invalid identifier: '{identifier}'{}", suggestion.as_ref().map(|s| format!(" - {}", s)).unwrap_or_default())]
#[diagnostic(code(fob::gen::invalid_identifier))]
InvalidIdentifier {
identifier: String,
suggestion: Option<String>,
},
#[error("Code generation failed: {context}{}", reason.as_ref().map(|r| format!(" - {}", r)).unwrap_or_default())]
#[diagnostic(code(fob::gen::codegen_failed))]
CodegenFailed {
context: String,
reason: Option<String>,
},
#[error("Invalid AST structure: {node_type}{}", details.as_ref().map(|d| format!(" - {}", d)).unwrap_or_default())]
#[diagnostic(code(fob::gen::invalid_ast))]
InvalidAst {
node_type: String,
details: Option<String>,
},
}
impl GenError {
pub fn invalid_identifier(identifier: impl Into<String>) -> Self {
Self::InvalidIdentifier {
identifier: identifier.into(),
suggestion: None,
}
}
pub fn codegen_failed(context: impl Into<String>) -> Self {
Self::CodegenFailed {
context: context.into(),
reason: None,
}
}
pub fn codegen_failed_with_reason(
context: impl Into<String>,
reason: impl Into<String>,
) -> Self {
Self::CodegenFailed {
context: context.into(),
reason: Some(reason.into()),
}
}
pub fn invalid_ast(node_type: impl Into<String>) -> Self {
Self::InvalidAst {
node_type: node_type.into(),
details: None,
}
}
}
pub type Result<T> = std::result::Result<T, GenError>;