use std::sync::Arc;
use platform_core::Platform;
use platform_desktop::{DesktopPathsProvider, WinitPlatform, WinitWindow};
use crate::app_runtime::AppRuntime;
use crate::config;
use crate::prefs::UserPrefs;
use super::handler::build_app_handler;
pub fn run_hot_reload_host(
lib_path: &str,
hot_port: &str,
config: crate::app_config::AppConfig,
app_name: &str,
) {
let Ok(port) = hot_port.parse::<u16>() else {
tracing::error!("invalid TELAR_HOT_PORT value: {hot_port}");
std::process::exit(1);
};
let initial_app = match crate::hot::load_hot_app(std::path::Path::new(lib_path)) {
Ok(app) => app,
Err(e) => {
tracing::error!("failed to load dylib: {e}");
std::process::exit(1);
}
};
let hot_rx = crate::hot::listen_hot_reload(port);
let paths: Arc<dyn services_core::AppPathsProvider> = Arc::new(DesktopPathsProvider);
#[cfg(feature = "dialogs")]
platform_desktop::DesktopFileDialogs::install();
#[cfg(feature = "clipboard")]
platform_desktop::DesktopClipboard::install();
let prefs = UserPrefs::load(app_name, paths.as_ref());
let backend = prefs.backend.unwrap_or_else(config::compile_time_backend);
let platform = match WinitPlatform::try_new() {
Ok(p) => p,
Err(e) => {
tracing::error!("Failed to create event loop: {e}");
std::process::exit(1);
}
};
let crate::app_config::AppConfig {
mut window,
font_paths,
font_data,
font_family,
} = config;
#[cfg(feature = "hot-reload")]
super::dev_window::apply_dev_window_overrides(&mut window);
if let Some(custom) = initial_app.window_config() {
window = custom;
}
let mut handler = build_app_handler::<WinitWindow, crate::DefaultDevTools>(
Box::new(initial_app),
paths,
crate::runner::font_config::FontSetup {
paths: font_paths,
data: font_data,
family: font_family,
},
backend,
prefs,
app_name.to_owned(),
super::host::SurfaceRenderer::builtin(),
);
handler.hot_reload_rx = Some(hot_rx);
if let Err(e) = platform.run(window, handler) {
tracing::error!("Event loop error: {e}");
std::process::exit(1);
}
}