use std::fmt::Display;
use arcstr::ArcStr;
use serde::{Deserialize, Serialize};
use crate::{parser::doc::StofParseError, runtime::{Type, Val}};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Error {
FormatStringImportNotImplemented(String),
FormatFileImportFsError(String),
FormatFileExportFsError(String),
FormatFileImportNotAllowed,
FormatFileExportNotAllowed,
FormatBinaryImportUtf8Error,
FormatStringExportNotImplemented(String),
GraphFormatNotFound,
RelativeImportWithoutContext,
ImportOsStringError,
JSONStringImport(String),
JSONStringExport(String),
TOMLStringImport(String),
TOMLStringExport(String),
YAMLStringImport(String),
YAMLStringExport(String),
BYTESExport(String),
PKGImport(String),
BSTFImport(String),
BSTFExport(String),
PDFImport(String),
PDFExport(String),
ImageImport(String),
ImageExport(String),
DocXImport(String),
FsReadStringStackError,
FsReadStringError(String),
FsReadStackError,
FsReadError(String),
FsWriteStackError,
FsWriteError(String),
Thrown(Val),
AssertFailed(String),
AssertNotFailed(String),
AssertEqFailed(String),
AssertNotEqFailed(String),
MapConstructor(String),
StdFunctions,
StdParse(String),
StdBlobify(String),
StdStringify(String),
StdHasFormat(String),
StdHasLib(String),
StdFormatContentType(String),
StdEnv,
StdSetEnv,
StdRemoveEnv,
HttpArgs(String),
HttpSendError(String),
TimeDiff,
TimeDiffNano,
TimeSleep,
TimeToRFC3339,
TimeToRFC2822,
TimeFromRFC3339,
TimeFromRFC2822,
FnId,
FnData,
FnBind,
FnName,
FnParams,
FnReturnType,
FnHasAttr,
FnAttributes,
FnObj,
FnObjs,
FnIsAsync,
FnCall,
FnExpandCall,
VerMajor,
VerSetMajor,
VerMinor,
VerSetMinor,
VerPatch,
VerSetPatch,
VerRelease,
VerSetRelease,
VerClearRelease,
VerBuild,
VerSetBuild,
VerClearBuild,
StrLen,
StrAt,
StrFirst,
StrLast,
StrStartsWith,
StrEndsWith,
StrPush,
StrContains,
StrIndexOf,
StrReplace,
StrSplit,
StrUpper,
StrLower,
StrTrim,
StrTrimStart,
StrTrimEnd,
StrSubstring,
StrRegexFail,
StrIsMatch,
StrFindAll,
PromptStr,
PromptText,
PromptTag,
PromptPrompts,
PromptSetText,
PromptSetTag,
PromptLen,
PromptAt,
PromptEmpty,
PromptAny,
PromptPush,
PromptPop,
PromptClear,
PromptReverse,
PromptRemove,
PromptInsert,
PromptReplace,
NumAbs,
NumSqrt,
NumCbrt,
NumFloor,
NumCeil,
NumTrunc,
NumFract,
NumSignum,
NumExp,
NumExp2,
NumLn,
NumAt,
NumRound,
NumRound2,
NumPow,
NumLog,
NumATan2,
NumNan,
NumInf,
NumHasUnits,
NumToUnits,
NumIsAngle,
NumIsTemp,
NumIsLength,
NumIsTime,
NumIsMass,
NumIsMemory,
NumRemoveUnits,
NumSin,
NumCos,
NumTan,
NumASin,
NumACos,
NumATan,
NumSinH,
NumCosH,
NumTanH,
NumASinH,
NumACosH,
NumATanH,
NumHex,
NumBin,
NumOct,
NumStr,
MapAppendOther,
MapClear,
MapContains,
MapFirst,
MapLast,
MapGet,
MapInsert,
MapEmpty,
MapAny,
MapKeys,
MapValues,
MapLen,
MapAt,
MapPopFirst,
MapPopLast,
MapRemove,
SetAppendOther,
SetClear,
SetContains,
SetFirst,
SetLast,
SetInsert,
SetSplit,
SetEmpty,
SetAny,
SetLen,
SetAt,
SetPopFirst,
SetPopLast,
SetRemove,
SetUnion,
SetDifference,
SetIntersection,
SetSymmetricDifference,
SetDisjoint,
SetSubset,
SetSuperset,
SetIsUniform,
SetToUniform,
ListAppendOther,
ListPushBack,
ListPushFront,
ListPopFront,
ListPopBack,
ListClear,
ListReverse,
ListReversed,
ListLen,
ListAt,
ListEmpty,
ListAny,
ListFirst,
ListLast,
ListJoin,
ListContains,
ListIndexOf,
ListRemove,
ListRemoveFirst,
ListRemoveLast,
ListRemoveAll,
ListInsert,
ListReplace,
ListSort,
ListSortBy,
ListIsUniform,
ListToUniform,
DataId,
DataTagname,
DataExists,
DataObjs,
DataDrop,
DataAttach,
DataMove,
DataField,
DataFromId,
DataToBlob,
DataFromBlob,
DataInvalidate,
DataValidate,
PdfExtractImages,
PdfExtractText,
ImageWidth,
ImageHeight,
ImageGrayscale,
ImageInvert,
ImageFlipVertical,
ImageFlipHorizontal,
ImageRotate90,
ImageRotate180,
ImageRotate270,
ImageResize,
ImageResizeExact,
ImageThumbnail,
ImageThumbnailExact,
ImageBlur,
ImageBlurFast,
ImageAdjustContrast,
ImageBrighten,
ImageBlob,
ImagePng,
ImageJpeg,
ImageGif,
ImageWebp,
ImageTiff,
ImageBmp,
ImageIco,
ImageFromBlob,
AgeNoMatchingKeys,
TupLen,
TupAt,
BlobLen,
BlobAt,
BlobUtf8Str,
BlobBase64Str,
BlobUrlSafeBase64Str,
BlobFromUtf8Str,
BlobFromBase64Str,
BlobFromUrlSafeBase64Str,
ObjName,
ObjId,
ObjPath,
ObjParent,
ObjIsParent,
ObjExists,
ObjChildren,
ObjRoot,
ObjIsRoot,
ObjProto,
ObjSetProto,
ObjRemoveProto,
ObjInstanceOf,
ObjUpcast,
ObjCreateType,
ObjLen,
ObjAt,
ObjAtRef,
ObjGet,
ObjGetRef,
ObjContains,
ObjInsert,
ObjRemove,
ObjMoveField,
ObjFields,
ObjFuncs,
ObjEmpty,
ObjAny,
ObjAttributes,
ObjMove,
ObjDistance,
ObjRun,
ObjSchemafy,
ObjDiff,
ObjToMap,
ObjToMapRef,
ObjFromMap,
ObjFromId,
ObjNewStack,
ObjectCastProtoDne,
AwaitError(Box<Self>),
ParseError(StofParseError),
Custom(ArcStr),
NotImplemented,
DeclareExisting,
DeclareInvalidName,
AssignConst,
VariableSet,
FieldReadOnlySet,
AssignSelf,
AssignSuper,
AssignRootNonObj,
AssignExistingRoot,
StackError,
ExecutionTimeout,
StackOverflow,
SelfStackError,
NewStackError,
CallStackError,
CallStackOverflow,
CastStackError,
CastVal(Type, Type),
FuncDne(String),
FuncDefaultArg(Box<Self>),
FuncArgs,
FuncInvalidReturn,
Truthy,
IsNull,
NotTruthy,
GreaterThan,
GreaterOrEq,
LessThan,
LessOrEq,
Eq,
Add,
Sub,
Mul,
Div,
Mod,
AND,
OR,
XOR,
SHL,
SHR,
}
impl Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::ParseError(error) => {
let message;
if let Some(path) = &error.file_path {
message = format!("{path}\n\t{}", &error.message);
} else {
message = error.message.clone();
}
write!(f, "{message}")
},
_ => {
write!(f, "{:?}", self)
}
}
}
}