api-server/src/main.rs

64 lines
1.5 KiB
Rust
Raw Normal View History

mod dem;
use axum::{
extract::{Path, State},
routing::get,
Router,
};
use axum_macros::debug_handler;
use std::env;
use tower_http::services::ServeDir;
use dem::DatasetRepository;
use tracing::info;
const DEFAULT_DATA_DIR: &str = "/data";
const DEFAULT_PORT: &str = "3000";
//#[tokio::main(flavor = "current_thread")]
#[tokio::main]
async fn main() {
// initialize tracing
tracing_subscriber::fmt::init();
let config = load_config().unwrap();
let cache = DatasetRepository::new(config.basedir);
let serve_dir = ServeDir::new("assets");
// build our application with a route
let app = Router::new()
.route("/elevation/:lat/:lon", get(get_elevation))
.nest_service("/", serve_dir)
.with_state(cache);
let host = format!("[::]:{}", config.port);
info!("Will start server on {host}");
let listener = tokio::net::TcpListener::bind(host).await.unwrap();
axum::serve(listener, app).await.unwrap();
}
#[debug_handler]
async fn get_elevation(State(dsr): State<DatasetRepository>, Path((lat, lon)): Path<(f64, f64)>) -> String {
let ele = dem::elevation_from_coordinates(dsr, lat, lon);
let myele = ele.await;
format!("{myele}")
}
fn load_config() -> Result<Config, env::VarError> {
Ok(Config {
basedir: env::var("DEM_LOCATION").unwrap_or_else(|_| DEFAULT_DATA_DIR.to_string()),
port: env::var("HTTP_PORT").unwrap_or_else(|_| DEFAULT_PORT.to_string()),
})
}
struct Config {
basedir: String,
port: String,
}