use proc_macro2::{Span, TokenStream};
use quote::quote_spanned;
pub struct ForgeError {
span: Span,
message: String,
}
impl ForgeError {
pub fn new(span: Span, message: impl Into<String>) -> Self {
Self {
span,
message: message.into(),
}
}
pub fn spanned(span: Span, message: impl Into<String>) -> Self {
Self::new(span, message)
}
pub fn call_site(message: impl Into<String>) -> Self {
Self::new(Span::call_site(), message)
}
pub fn to_compile_error(&self) -> TokenStream {
let msg = &self.message;
quote_spanned!(self.span => compile_error!(#msg))
}
}
impl From<serde_json::Error> for ForgeError {
fn from(e: serde_json::Error) -> Self {
Self::call_site(format!("JSON parse error: {e}"))
}
}
impl From<std::io::Error> for ForgeError {
fn from(e: std::io::Error) -> Self {
Self::call_site(format!("I/O error reading JSON file: {e}"))
}
}
pub type ForgeResult<T> = Result<T, ForgeError>;