use std::fmt::Display;
use starlark_syntax::diagnostic::WithDiagnostic;
use starlark_syntax::eval_exception::EvalException;
use crate::codemap::CodeMap;
use crate::codemap::Span;
#[derive(Debug)]
pub struct InternalError(EvalException);
impl InternalError {
#[cold]
pub(crate) fn msg(message: impl Display, span: Span, codemap: &CodeMap) -> InternalError {
InternalError(EvalException::new(
crate::Error::new_kind(crate::ErrorKind::Internal(anyhow::Error::msg(
message.to_string(),
))),
span,
codemap,
))
}
#[cold]
pub(crate) fn from_diagnostic(d: WithDiagnostic<impl Display>) -> InternalError {
let internal = d.map(|m| {
crate::Error::new_kind(crate::ErrorKind::Internal(anyhow::Error::msg(
m.to_string(),
)))
});
InternalError(internal.into())
}
#[cold]
pub(crate) fn from_eval_exception(e: EvalException) -> InternalError {
InternalError(e.into_internal_error())
}
#[cold]
pub(crate) fn from_error(e: crate::Error, span: Span, codemap: &CodeMap) -> InternalError {
let e = e.into_internal_error();
InternalError(EvalException::new(e, span, codemap))
}
#[cold]
pub(crate) fn into_error(self) -> crate::Error {
self.0.into_error()
}
#[cold]
pub(crate) fn into_eval_exception(self) -> EvalException {
self.0
}
}
pub struct TypingError(EvalException);
impl TypingError {
#[cold]
pub(crate) fn msg(message: impl Display, span: Span, codemap: &CodeMap) -> TypingError {
TypingError(EvalException::new_anyhow(
anyhow::Error::msg(message.to_string()),
span,
codemap,
))
}
#[cold]
pub(crate) fn new(error: crate::Error, span: Span, codemap: &CodeMap) -> TypingError {
TypingError(EvalException::new(error, span, codemap))
}
#[cold]
pub(crate) fn new_anyhow(error: anyhow::Error, span: Span, codemap: &CodeMap) -> TypingError {
TypingError(EvalException::new_anyhow(error, span, codemap))
}
#[cold]
pub(crate) fn from_eval_exception(e: EvalException) -> TypingError {
TypingError(e)
}
#[cold]
pub(crate) fn into_error(self) -> crate::Error {
self.0.into_error()
}
#[cold]
pub(crate) fn into_eval_exception(self) -> EvalException {
self.0
}
}
pub struct TypingNoContextError;
pub enum TypingOrInternalError {
Typing(TypingError),
Internal(InternalError),
}
impl From<TypingError> for TypingOrInternalError {
fn from(e: TypingError) -> Self {
TypingOrInternalError::Typing(e)
}
}
impl From<InternalError> for TypingOrInternalError {
fn from(e: InternalError) -> Self {
TypingOrInternalError::Internal(e)
}
}
pub enum TypingNoContextOrInternalError {
Typing,
Internal(InternalError),
}
impl From<TypingNoContextError> for TypingNoContextOrInternalError {
fn from(_: TypingNoContextError) -> Self {
TypingNoContextOrInternalError::Typing
}
}
impl From<InternalError> for TypingNoContextOrInternalError {
fn from(e: InternalError) -> Self {
TypingNoContextOrInternalError::Internal(e)
}
}