deft 0.15.0

Cross platform ui framework
use std::cell::Cell;
use crate as deft;
use crate::app::exit_app;
use crate::is_mobile_platform;
use crate::js::js_engine::JsEngine;
use deft_macros::js_methods;
use log::error;
use quick_js::exception::HostPromiseRejectionTracker;
use quick_js::JsValue;
use std::env;

thread_local! {
    pub static EXIT_ON_ALL_WINDOWS_CLOSED: Cell<bool> = Cell::new(true);
}

struct UserPromiseRejectionTracker {
    handler: JsValue,
}

impl HostPromiseRejectionTracker for UserPromiseRejectionTracker {
    fn track_promise_rejection(&mut self, promise: JsValue, reason: JsValue, _is_handled: bool) {
        if let Err(e) = self.handler.call_as_function(vec![reason, promise]) {
            error!("Failed to call user promise rejection handler: {:?}", e);
        }
    }
}

#[allow(nonstandard_style)]
pub struct process;

#[js_methods]
impl process {
    #[js_func]
    pub fn exit(code: i32) {
        let _ = exit_app(code);
    }

    #[js_func]
    pub fn set_exit_on_all_windows_closed(value: bool) {
        EXIT_ON_ALL_WINDOWS_CLOSED.set(value);
    }

    #[js_func]
    pub fn argv() -> Vec<String> {
        env::args().collect()
    }

    #[js_func]
    pub fn is_mobile_platform() -> bool {
        is_mobile_platform()
    }

    #[js_func]
    pub fn platform() -> String {
        crate::platform::PLATFORM_NAME.to_string()
    }

    #[js_func]
    pub fn set_promise_rejection_tracker(handler: JsValue) {
        let mut js_engine = JsEngine::get();
        let tracker = UserPromiseRejectionTracker { handler };
        js_engine.js_context.set_promise_rejection_tracker(tracker);
    }
}