1#![allow(
2 clippy::cast_possible_truncation,
3 clippy::cast_precision_loss,
4 clippy::cast_sign_loss,
5 reason = "screen, tile, and GPU coordinates are deliberately narrowed after viewport bounds"
6)]
7
8macro_rules! product_phase {
9 ($name:literal, $body:expr) => {{
10 let _phase = tracing::info_span!(target: "eternalist::product", $name).entered();
11 $body
12 }};
13}
14
15mod annotation;
16mod app;
17mod basemap;
18mod cadence;
19mod chrome;
20mod civic_area;
21mod commands;
22mod export;
23mod forge;
24mod gallery;
25mod habitat;
26mod host;
27mod lexicon;
28mod library;
29mod live_area;
30mod map;
31mod palette;
32mod persistence;
33mod portfolio;
34mod preferences;
35mod profile;
36mod project;
37mod projects;
38mod readout;
39mod relief;
40mod search_boundary;
41mod slate;
42mod trail_data;
43mod trail_map;
44mod vector_field;
45mod vector_map;
46mod witness;
47
48use anyhow::Result;
49use std::path::PathBuf;
50
51pub use export::{SavedTrailListing, export_saved_gpx, saved_trails};
52
53#[derive(Clone, Debug, Eq, PartialEq)]
54pub enum ProjectIntent {
55 Resume,
56 Open(PathBuf),
57}
58
59pub fn run(intent: ProjectIntent, offline: bool) -> Result<()> {
61 let trace = eternalist_apps::TraceGuard::arm()?;
62 let bootstrap =
63 tracing::info_span!(target: "eternalist::startup", "application.bootstrap").entered();
64 let habitat = habitat::Habitat::discover()?;
65 let ctx = egui::Context::default();
66 dwemer_poolrooms::chrome::install(&ctx);
67 let app = projects::Workbench::launch(&ctx, habitat, intent, offline);
68 drop(bootstrap);
69 let result = host::run(ctx, app);
70 trace.flush();
71 result
72}