diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2025-06-26 22:10:31 +0200 | 
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2025-06-26 22:10:31 +0200 | 
| commit | 99150875308e0cac89f4de2996cfd1954305dcfe (patch) | |
| tree | f19224064543aed367522b05778a992d7385c712 /src/main.rs | |
| parent | 6adcd94a6747fe7ec6f1ad1073453636847a0bff (diff) | |
| download | hittekaart-99150875308e0cac89f4de2996cfd1954305dcfe.tar.gz hittekaart-99150875308e0cac89f4de2996cfd1954305dcfe.tar.bz2 hittekaart-99150875308e0cac89f4de2996cfd1954305dcfe.zip  | |
split crate into core and cli
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 164 | 
1 files changed, 0 insertions, 164 deletions
diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 11133af..0000000 --- a/src/main.rs +++ /dev/null @@ -1,164 +0,0 @@ -use std::{io, path::PathBuf}; - -use clap::{Parser, ValueEnum}; -use color_eyre::{ -    eyre::{bail, eyre, Result}, -    Report, -}; -use hittekaart::{ -    gpx::{self, Compression}, -    renderer::{self, heatmap, marktile, tilehunt, Renderer}, -    storage::{Folder, Sqlite, Storage}, -}; -use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget, ProgressStyle}; -use is_terminal::IsTerminal; -use rayon::{ -    iter::{IndexedParallelIterator, IntoParallelRefIterator, ParallelIterator}, -    ThreadPoolBuilder, -}; - -/// Tile generation mode. -#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq, Hash)] -enum Mode { -    Heatmap, -    Marktile, -    Tilehunter, -} - -#[derive(Parser, Debug, Clone)] -#[command(author, version, about)] -struct Args { -    /// The GPX files to parse. -    #[arg(required = true)] -    files: Vec<PathBuf>, - -    /// Minimum zoom level to generate tiles for. -    #[arg(long, default_value_t = 0)] -    min_zoom: u32, - -    /// Maximum zoom level to generate tiles for. -    #[arg(long, default_value_t = 19)] -    max_zoom: u32, - -    /// Number of threads to use. Set to 0 to use all available CPU cores. -    #[arg(long, short, default_value_t = 0)] -    threads: usize, - -    /// The output directory. Will be created if it does not exist. Defaults to "tiles" for the -    /// folder-based storage, and "tiles.sqlite" for the SQLite-based storage. -    #[arg(long, short)] -    output: Option<PathBuf>, - -    /// Store the tiles in a SQLite database. If given, `--output` will determine the SQLite -    /// filename. -    #[arg(long)] -    sqlite: bool, - -    /// Generation mode. -    #[arg(value_enum, long, short, default_value_t = Mode::Heatmap)] -    mode: Mode, - -    /// Zoom level for the tilehunter mode. -    #[arg(long, default_value_t = 14)] -    tilehunter_zoom: u32, -} - -fn main() -> Result<()> { -    color_eyre::install()?; - -    let args = Args::parse(); - -    if args.max_zoom < args.min_zoom { -        bail!("Max zoom cannot be smaller than min zoom!"); -    } - -    ThreadPoolBuilder::new() -        .num_threads(args.threads) -        .build_global()?; - -    match args.mode { -        Mode::Heatmap => run(heatmap::Renderer, args), -        Mode::Marktile => run(marktile::Renderer, args), -        Mode::Tilehunter => run(tilehunt::Renderer::new(args.tilehunter_zoom), args), -    } -} - -fn run<R: Renderer>(renderer: R, args: Args) -> Result<()> { -    let progress_style = -        ProgressStyle::with_template("[{elapsed}] {prefix:.cyan} {wide_bar} {pos:.green}/{len}")?; -    let zoom_style = -        ProgressStyle::with_template("[{elapsed}] {prefix:.yellow} {wide_bar} {pos:.green}/{len}")?; - -    let use_progress_bars = io::stdout().is_terminal(); -    let make_bar = |len| { -        if use_progress_bars { -            ProgressBar::new(len) -        } else { -            ProgressBar::hidden() -        } -    }; - -    let bar = make_bar(args.files.len().try_into().unwrap()).with_style(progress_style.clone()); -    bar.set_prefix("Reading GPX files"); - -    let mut tracks = Vec::new(); -    args.files -        .par_iter() -        .map(|file| { -            let compression = Compression::suggest_from_path(file) -                .ok_or_else(|| eyre!("Could not determine format for {file:?}"))?; -            let data = gpx::extract_from_file(file, compression)?; -            bar.inc(1); -            Ok::<_, Report>(data) -        }) -        .collect_into_vec(&mut tracks); -    let tracks = tracks.into_iter().collect::<Result<Vec<_>>>()?; -    bar.finish(); - -    let mut storage: Box<dyn Storage + Send> = if args.sqlite { -        let output = args.output.unwrap_or_else(|| "tiles.sqlite".into()); -        Box::new(Sqlite::connect(output)?) -    } else { -        let output = args.output.unwrap_or_else(|| "tiles".into()); -        Box::new(Folder::new(output)) -    }; -    storage.prepare()?; - -    let multibar = MultiProgress::new(); -    if !use_progress_bars { -        multibar.set_draw_target(ProgressDrawTarget::hidden()) -    } -    let zoom_bar = make_bar((args.max_zoom - args.min_zoom + 1).into()).with_style(zoom_style); -    multibar.add(zoom_bar.clone()); -    zoom_bar.set_prefix("Zoom levels"); - -    for zoom in args.min_zoom..=args.max_zoom { -        let bar = make_bar(tracks.len().try_into().unwrap()).with_style(progress_style.clone()); -        multibar.insert_from_back(1, bar.clone()); -        bar.set_prefix("Rendering heat zones"); -        let counter = renderer::prepare(&renderer, zoom, &tracks, || { -            bar.inc(1); -            Ok(()) -        })?; -        bar.finish(); -        multibar.remove(&bar); - -        storage.prepare_zoom(zoom)?; - -        let bar = make_bar(renderer.tile_count(&counter)?).with_style(progress_style.clone()); -        multibar.insert_from_back(1, bar.clone()); -        bar.set_prefix("Saving heat tiles"); -        renderer::colorize(&renderer, counter, |rendered_tile| { -            storage.store(zoom, rendered_tile.x, rendered_tile.y, &rendered_tile.data)?; -            bar.inc(1); -            Ok(()) -        })?; -        bar.finish(); -        multibar.remove(&bar); -        zoom_bar.inc(1); -    } -    storage.finish()?; -    zoom_bar.finish(); - -    Ok(()) -}  | 
