stdweb/webapi/error.rs
1use webcore::value::Reference;
2use webcore::try_from::TryInto;
3use webcore::reference_type::ReferenceType;
4
5/// Represents the JavaScript `Error` interface. An `Error` is thrown whenever a run-time error
6/// occurs.
7///
8/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)
9// https://www.ecma-international.org/ecma-262/6.0/#sec-error-objects
10pub trait IError: ReferenceType {
11 /// Returns a human-readable description of the error.
12 ///
13 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/message)
14 // https://www.ecma-international.org/ecma-262/6.0/#sec-error.prototype.message
15 #[inline]
16 fn message( &self ) -> String {
17 js!(
18 return @{self.as_ref()}.message;
19 ).try_into().unwrap()
20 }
21
22 /// Returns a name specifiying the type of error.
23 ///
24 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/name)
25 // https://www.ecma-international.org/ecma-262/6.0/#sec-error.prototype.name
26 #[inline]
27 fn name( &self ) -> String {
28 js!(
29 return @{self.as_ref()}.name;
30 ).try_into().unwrap()
31 }
32}
33
34/// A reference to a JavaScript `Error` object. An `Error` is thrown whenever a run-time error
35/// occurs.
36///
37/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)
38// https://www.ecma-international.org/ecma-262/6.0/#sec-error-objects
39#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
40#[reference(instance_of = "Error")]
41pub struct Error( Reference );
42
43impl Error {
44 /// Creates a new `Error` with the specified `description`.
45 ///
46 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)
47 #[inline]
48 pub fn new( description: &str ) -> Self {
49 js!( return new Error( @{description} ); ).try_into().unwrap()
50 }
51}
52
53impl IError for Error {}
54
55error_boilerplate! { Error }
56
57/// Used to indicate an unsuccessful operation when none of the other NativeError objects are an appropriate indication of the failure cause.
58// https://tc39.github.io/ecma262/#sec-native-error-types-used-in-this-standard-typeerror
59#[derive(Clone, Debug, ReferenceType)]
60#[reference(subclass_of(Error))]
61#[reference(instance_of = "TypeError")]
62pub struct TypeError( Reference );
63
64impl IError for TypeError {}
65
66error_boilerplate! { TypeError }
67
68#[cfg(test)]
69mod test {
70 use super::*;
71
72 #[test]
73 fn test_error() {
74 use std::fmt::Write;
75
76 let error: Error = js!(
77 return new Error("foo");
78 ).try_into().unwrap();
79
80 assert_eq!(error.name(), "Error");
81 assert_eq!(error.message(), "foo");
82
83 let mut text = String::new();
84 write!(&mut text, "{}", error).unwrap();
85 assert_eq!(&text, "Error: foo");
86 assert_eq!(std::error::Error::description(&error), "Error");
87 }
88
89 #[test]
90 fn test_type_error() {
91 let _: TypeError = js!( return new TypeError( "Big bad wolf" ); ).try_into().unwrap();
92 }
93}