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}