1use crate::*;
2use std::error::Error as StdError;
3use std::fmt;
4use std::result::Result as StdResult;
5
6pub type Result<T> = StdResult<T, Error>;
8
9#[derive(Debug)]
11pub enum Error {
12 ToJsConversionError {
14 from: &'static str,
16 to: &'static str,
18 },
19 FromJsConversionError {
21 from: &'static str,
23 to: &'static str,
25 },
26 Timeout,
28 RecursiveMutCallback,
33 InvalidTimeout,
35 ExternalError(Box<dyn StdError + 'static>),
39 Value(Value),
41}
42
43impl Error {
44 pub fn to_value(self, mv8: &MiniV8) -> Value {
46 match self {
47 Error::Value(value) => value,
48 Error::ToJsConversionError { .. } |
49 Error::FromJsConversionError { .. } => {
50 let object = mv8.create_object();
51 let _ = object.set("name", "TypeError");
52 let _ = object.set("message", self.to_string());
53 Value::Object(object)
54 },
55 _ => {
56 let object = mv8.create_object();
57 let _ = object.set("name", "Error");
58 let _ = object.set("message", self.to_string());
59 Value::Object(object)
60 },
61 }
62 }
63
64 pub(crate) fn from_js_conversion(from: &'static str, to: &'static str) -> Error {
65 Error::FromJsConversionError { from, to }
66 }
67}
68
69impl StdError for Error {
70 fn description(&self) -> &'static str {
71 "JavaScript execution error"
72 }
73}
74
75impl fmt::Display for Error {
76 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
77 match self {
78 Error::ToJsConversionError { from, to } => {
79 write!(fmt, "error converting {} to JavaScript {}", from, to)
80 },
81 Error::FromJsConversionError { from, to } => {
82 write!(fmt, "error converting JavaScript {} to {}", from, to)
83 },
84 Error::Timeout => write!(fmt, "evaluation timed out"),
85 Error::RecursiveMutCallback => write!(fmt, "mutable callback called recursively"),
86 Error::InvalidTimeout => write!(fmt, "invalid request for evaluation timeout"),
87 Error::ExternalError(ref err) => err.fmt(fmt),
88 Error::Value(v) => write!(fmt, "JavaScript runtime error ({})", v.type_name()),
89 }
90 }
91}