wsdom_core/js/
operators.rs

1use super::primitives::{JsBoolean, JsNumber, JsString};
2use super::value::JsValue;
3use crate::link::Browser;
4use crate::serialize::{UseInJsCode, UseInJsCodeWriter};
5use crate::{JsCast, ToJs};
6
7#[rustfmt::skip]
8impl Browser {
9    /// The JavaScript `+` operator
10    pub fn op_add           (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsValue    {self.value_from_raw_code(format_args!("(({}) + ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
11    /// The JavaScript `-` operator
12    pub fn op_sub           (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) - ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
13    /// The JavaScript `*` operator
14    pub fn op_mul           (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) * ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
15    /// The JavaScript `/` operator
16    pub fn op_div           (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) / ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
17    /// The JavaScript `%` operator
18    pub fn op_remainder     (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) % ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
19    /// The JavaScript `**` operator
20    pub fn op_exponent      (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) ** ({}))",    UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
21    /// The JavaScript `&` operator
22    pub fn op_bitwise_and   (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) & ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
23    /// The JavaScript `|` operator
24    pub fn op_bitwise_or    (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) | ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
25    /// The JavaScript `^` operator
26    pub fn op_bitwise_xor   (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) ^ ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
27    /// The JavaScript `<<` operator
28    pub fn op_lshift2       (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) << ({}))",    UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
29    /// The JavaScript `>>` operator
30    pub fn op_rshift2       (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) >> ({}))",    UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
31    /// The JavaScript `>>>` operator
32    pub fn op_rshift3       (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber   {self.value_from_raw_code(format_args!("(({}) >>> ({}))",   UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
33    /// The JavaScript `&&` operator
34    pub fn op_logical_and   (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsValue    {self.value_from_raw_code(format_args!("(({}) && ({}))",    UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
35    /// The JavaScript `||` operator
36    pub fn op_logical_or    (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsValue    {self.value_from_raw_code(format_args!("(({}) || ({}))",    UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
37    /// The JavaScript `==` operator
38    pub fn op_eq2           (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean  {self.value_from_raw_code(format_args!("(({}) == ({}))",    UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
39    /// The JavaScript `!=` operator
40    pub fn op_neq1          (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean  {self.value_from_raw_code(format_args!("(({}) != ({}))",    UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
41    /// The JavaScript `===` operator
42    pub fn op_eq3           (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean  {self.value_from_raw_code(format_args!("(({}) === ({}))",   UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
43    /// The JavaScript `!==` operator
44    pub fn op_neq2          (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean  {self.value_from_raw_code(format_args!("(({}) !== ({}))",   UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
45    /// The JavaScript `>` operator
46    pub fn op_gt            (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean  {self.value_from_raw_code(format_args!("(({}) > ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
47    /// The JavaScript `>=` operator
48    pub fn op_gte           (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean  {self.value_from_raw_code(format_args!("(({}) >= ({}))",    UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
49    /// The JavaScript `<` operator
50    pub fn op_lt            (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean  {self.value_from_raw_code(format_args!("(({}) < ({}))",     UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
51    /// The JavaScript `<=` operator
52    pub fn op_lte           (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean  {self.value_from_raw_code(format_args!("(({}) <= ({}))",    UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
53
54    /// The JavaScript `-` operator
55    pub fn op_neg           (&self, a: &dyn UseInJsCode) -> JsNumber    {self.value_from_raw_code(format_args!("(-({}))", UseInJsCodeWriter(a))).unchecked_into()}
56    /// The JavaScript `~` operator
57    pub fn op_bitwise_not   (&self, a: &dyn UseInJsCode) -> JsNumber    {self.value_from_raw_code(format_args!("(~({}))", UseInJsCodeWriter(a))).unchecked_into()}
58    /// The JavaScript `!` operator
59    pub fn op_logical_not   (&self, a: &dyn UseInJsCode) -> JsBoolean   {self.value_from_raw_code(format_args!("(!({}))", UseInJsCodeWriter(a))).unchecked_into()}
60}
61
62macro_rules! impl_number_op {
63    ($trait_name:ident, $method_name:ident, $wsdom_name:ident) => {
64        impl<'a, T: ToJs<JsNumber>> $trait_name<&'a T> for &'a JsNumber {
65            type Output = JsNumber;
66
67            fn $method_name(self, rhs: &'a T) -> Self::Output {
68                self.browser.$wsdom_name(self, rhs).unchecked_into()
69            }
70        }
71    };
72}
73
74use std::ops::*;
75impl_number_op!(Add, add, op_add);
76impl_number_op!(Sub, sub, op_sub);
77impl_number_op!(Mul, mul, op_mul);
78impl_number_op!(Div, div, op_div);
79impl_number_op!(Rem, rem, op_remainder);
80impl_number_op!(Shl, shl, op_lshift2);
81impl_number_op!(Shr, shr, op_rshift2);
82impl_number_op!(BitAnd, bitand, op_bitwise_and);
83impl_number_op!(BitOr, bitor, op_bitwise_or);
84impl_number_op!(BitXor, bitxor, op_bitwise_xor);
85
86impl<'a, T: ToJs<JsString>> Add<&'a T> for &'a JsString {
87    type Output = JsString;
88
89    fn add(self, rhs: &'a T) -> Self::Output {
90        self.browser.op_add(self, rhs).unchecked_into()
91    }
92}
93impl<'a> Neg for &'a JsNumber {
94    type Output = JsNumber;
95
96    fn neg(self) -> Self::Output {
97        self.browser.op_neg(self)
98    }
99}