use crate::dev_plugin::DevPlugin;
use platform_core::{Platform, PlatformError};
use renderer_core::RendererFactory;
use services_core::AppPathsProvider;
use std::sync::Arc;
use crate::app::App;
use crate::app_config::AppConfig;
use crate::config;
use crate::prefs::UserPrefs;
use super::handler::build_app_handler;
use super::host::{SurfaceRenderer, SurfaceWindow};
pub fn run_with_platform<P, A, D>(
platform: P,
config: AppConfig,
paths: Arc<dyn AppPathsProvider>,
app: A,
app_name: &str,
) -> Result<(), PlatformError>
where
P: Platform,
P::Window: SurfaceWindow,
A: App,
D: DevPlugin,
{
run_on_platform::<P, A, D>(
platform,
config,
paths,
app,
app_name,
SurfaceRenderer::builtin(),
)
}
pub fn run_with_platform_and_renderer<P, F, A, D>(
platform: P,
factory: F,
config: AppConfig,
paths: Arc<dyn AppPathsProvider>,
app: A,
app_name: &str,
) -> Result<(), PlatformError>
where
P: Platform,
P::Window: Clone + Send + Sync + 'static,
F: RendererFactory<P::Window>,
A: App,
D: DevPlugin,
{
run_on_platform::<P, A, D>(
platform,
config,
paths,
app,
app_name,
SurfaceRenderer::installed(factory),
)
}
fn run_on_platform<P, A, D>(
platform: P,
config: AppConfig,
paths: Arc<dyn AppPathsProvider>,
app: A,
app_name: &str,
renderer: SurfaceRenderer<P::Window>,
) -> Result<(), PlatformError>
where
P: Platform,
P::Window: Clone + Send + Sync + 'static,
A: App,
D: DevPlugin,
{
services_core::app_paths::install(app_name, paths.clone());
let prefs = UserPrefs::load(app_name, paths.as_ref());
let backend = prefs.backend.unwrap_or_else(config::compile_time_backend);
let AppConfig {
window,
font_paths,
font_data,
} = config;
let window = super::resolved_window(window, &app);
let handler = build_app_handler::<P::Window, D>(
Box::new(app),
paths,
font_paths,
font_data,
backend,
prefs,
app_name.to_owned(),
renderer,
);
platform.run(window, handler)
}