summaryrefslogtreecommitdiffstats
path: root/toolkit/components/uniffi-bindgen-gecko-js/src/render/shared.rs
blob: 7b2d2e19adc8d8a4fd2b1e30bb96e0cf32e5565f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/* This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/// Extension traits that are shared across multiple render targets
use crate::Config;
use extend::ext;
use uniffi_bindgen::interface::{Function, Method, Object};

/// Check if a JS function should be async.
///
/// `uniffi-bindgen-gecko-js` has special async handling.  Many non-async Rust functions end up
/// being async in js
fn is_js_async(config: &Config, spec: &str) -> bool {
    if config.receiver_thread.main.contains(spec) {
        false
    } else if config.receiver_thread.worker.contains(spec) {
        true
    } else {
        match &config.receiver_thread.default {
            Some(t) => t != "main",
            _ => true,
        }
    }
}

#[ext]
pub impl Function {
    fn is_js_async(&self, config: &Config) -> bool {
        is_js_async(config, self.name())
    }
}

#[ext]
pub impl Object {
    fn is_constructor_async(&self, config: &Config) -> bool {
        is_js_async(config, self.name())
    }

    fn is_method_async(&self, method: &Method, config: &Config) -> bool {
        is_js_async(config, &format!("{}.{}", self.name(), method.name()))
    }
}