use crate::{
DomNode, JsJson,
dev::LongPtr,
driver_module::{
api::{api_arguments, api_command_wasm, api_server_handler, close_fetch_cache},
driver::get_driver,
get_driver_dom,
init_env::init_env,
},
};
pub fn start_app(init_app: fn() -> DomNode) {
init_env();
mount(init_app)
}
pub(crate) fn mount(init_app: impl FnOnce() -> DomNode) {
let driver = get_driver();
driver.transaction(|_| {
let root_view = init_app();
driver.set_root(root_view);
});
get_driver_dom().flush_dom_changes();
close_fetch_cache();
}
#[cfg(test)]
pub(crate) fn in_first_render<T>(create: impl FnOnce() -> T) -> T {
use crate as vertigo;
let mut created = None;
mount(|| {
created = Some(create());
vertigo::dom! { <div /> }
});
drop(get_driver().take_root());
let Some(created) = created else {
unreachable!("mount renders the app")
};
created
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub fn vertigo_export_handle_url(url_ptr: u64) -> u64 {
let url_ptr = LongPtr::from(url_ptr);
let url = api_arguments().get_by_long_ptr(url_ptr);
let JsJson::String(url) = url else {
panic!("string expected");
};
let response = api_server_handler().handler(&url);
response.to_ptr_long().get_long_ptr()
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub fn vertigo_export_alloc_block(size: u32) -> u64 {
api_arguments().alloc(size).get_long_ptr()
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub fn vertigo_export_free_block(long_ptr: u64) {
let long_ptr = LongPtr::from(long_ptr);
api_arguments().free(long_ptr);
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub fn vertigo_export_wasm_command(value_long_ptr: u64) -> u64 {
let value_long_ptr = LongPtr::from(value_long_ptr);
let value = api_arguments().get_by_long_ptr(value_long_ptr);
let response = api_command_wasm().command_from_js(value);
response.to_ptr_long().get_long_ptr()
}