use thiserror::Error;
pub type Result<T> = std::result::Result<T, CompilerError>;
#[derive(Error, Debug)]
pub enum CompilerError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Parse error at {line}:{column}: {message}")]
ParseError {
line: usize,
column: usize,
message: String,
},
#[error("Type error: {message}")]
TypeError { message: String },
#[error("Semantic error: {message}")]
SemanticError { message: String },
#[error("Generation error: {message}")]
GenerationError { message: String },
#[error("Unsupported TypeScript feature: {feature}")]
UnsupportedFeature { feature: String },
#[error("Internal compiler error: {message}")]
InternalError { message: String },
}
impl CompilerError {
pub fn parse_error(line: usize, column: usize, message: impl Into<String>) -> Self {
Self::ParseError {
line,
column,
message: message.into(),
}
}
pub fn type_error(message: impl Into<String>) -> Self {
Self::TypeError {
message: message.into(),
}
}
pub fn semantic_error(message: impl Into<String>) -> Self {
Self::SemanticError {
message: message.into(),
}
}
pub fn generation_error(message: impl Into<String>) -> Self {
Self::GenerationError {
message: message.into(),
}
}
pub fn unsupported_feature(feature: impl Into<String>) -> Self {
Self::UnsupportedFeature {
feature: feature.into(),
}
}
pub fn internal_error(message: impl Into<String>) -> Self {
Self::InternalError {
message: message.into(),
}
}
}