geosuggest-core

Library to suggest and to find nearest by coordinates cities

Live demo with sources

HTTP service

Examples

Usage example ```rust use tokio; use anyhow::Result;

use geosuggestcore::{Engine, storage::{self, IndexStorage}}; use geosuggestutils::{IndexUpdater, IndexUpdaterSettings};

[tokio::main]

async fn main() -> Result<()> { println!("Build index..."); let engine = load_engine().await?;

println!(
    "Suggest result: {:#?}",
    engine.suggest::<&str>("Beverley", 1, None, Some(&["us"]))
);
println!(
    "Reverse result: {:#?}",
    engine.reverse::<&str>((11.138298, 57.510973), 1, None, None)
);

Ok(())

}

async fn loadengine() -> Result { let indexfile = std::path::Path::new("/tmp/geosuggest-index.bincode");

let updater = IndexUpdater::new(IndexUpdaterSettings {
    names: None, // no multilang support
    ..Default::default()
})?;

let storage = storage::bincode::Storage::new();

Ok(if index_file.exists() {
    // load existed index
    let metadata = storage
        .read_metadata(index_file)
        .map_err(|e| anyhow::anyhow!("On load index metadata from {index_file:?}: {e}"))?;

    match metadata {
        Some(m) if updater.has_updates(&m).await? => {
            let engine = updater.build().await?;
            storage
                .dump_to(index_file, &engine)
                .map_err(|e| anyhow::anyhow!("Failed dump to {index_file:?}: {e}"))?;
            engine
        }
        _ => storage
            .load_from(index_file)
            .map_err(|e| anyhow::anyhow!("On load index from {index_file:?}: {e}"))?,
    }
} else {
    // initial
    let engine = updater.build().await?;
    storage
        .dump_to(index_file, &engine)
        .map_err(|e| anyhow::anyhow!("Failed dump to {index_file:?}: {e}"))?;
    engine
})

} ```