use std::collections::HashMap;
use geoprox_core::models::{LatLngCoord, Neighbor};
use serde::{Deserialize, Serialize};
use utoipa::{IntoParams, ToResponse, ToSchema};
#[derive(Serialize, ToSchema, ToResponse)]
pub struct DecodeGeohashResponse {
pub lat: f64,
pub lat_error: f64,
pub lng: f64,
pub lng_error: f64,
}
#[derive(Serialize, Deserialize, ToSchema, IntoParams)]
pub struct EncodeLatLng {
pub lat: f64,
pub lng: f64,
#[schema(minimum = 1, maximum = 10)]
pub depth: usize,
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct EncodeLatLngResponse {
pub geohash: String,
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct GeohashNeighborsResponse {
pub sw: String,
pub s: String,
pub se: String,
pub w: String,
pub e: String,
pub nw: String,
pub n: String,
pub ne: String,
}
impl From<geoprox_core::geohash::Neighbors> for GeohashNeighborsResponse {
fn from(value: geoprox_core::geohash::Neighbors) -> Self {
Self {
sw: value.sw,
s: value.s,
se: value.se,
w: value.w,
e: value.e,
nw: value.nw,
n: value.n,
ne: value.ne,
}
}
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct CreateIndexResponse {
pub created: bool,
pub existed: bool,
}
#[derive(Deserialize, ToSchema)]
pub struct InsertKey {
pub key: String,
pub lat: f64,
pub lng: f64,
pub ttl: Option<u64>,
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct InsertKeyResponse {
pub key: String,
pub geohash: String,
}
#[derive(Deserialize, ToSchema)]
pub struct InsertKeyBatch {
pub keys: Vec<InsertKey>,
pub ttl: Option<u64>,
pub preserve_order: bool,
}
impl From<InsertKeyBatch> for Vec<(String, LatLngCoord)> {
fn from(val: InsertKeyBatch) -> Self {
val.keys
.iter()
.map(|insert| (insert.key.to_owned(), [insert.lat, insert.lng]))
.collect()
}
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct InsertKeyBatchResponse {
pub results: HashMap<String, String>,
pub errors: HashMap<String, String>,
}
#[derive(Deserialize, ToSchema)]
pub struct RemoveKey {
pub key: String,
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct RemoveKeyResponse {
pub key: String,
pub deleted: bool,
}
#[derive(Deserialize, ToSchema)]
pub struct RemoveKeyBatch {
pub keys: Vec<String>,
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct RemoveKeyBatchResponse {
pub deleted: bool,
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct DropIndexResponse {
pub deleted: bool,
}
#[derive(Deserialize, ToSchema, IntoParams)]
pub struct QueryRange {
pub lat: f64,
pub lng: f64,
#[schema(minimum = 0, maximum = 0xFFFF)]
pub range: u16,
#[schema(minimum = 1, maximum = 0xFFFF)]
pub count: Option<usize>,
pub sorted: Option<bool>,
}
#[derive(Serialize, Deserialize, ToSchema, ToResponse)]
pub struct QueryRangeResponse {
pub found: Vec<Neighbor>,
}
#[derive(Deserialize, ToSchema, IntoParams)]
pub struct QueryRangeMany {
pub indices: Vec<String>,
pub lat: f64,
pub lng: f64,
#[schema(minimum = 0, maximum = 0xFFFF)]
pub range: u16,
#[schema(minimum = 1, maximum = 0xFFFF)]
pub count: Option<usize>,
pub sorted: Option<bool>,
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct QueryRangeManyResponse {
pub results: HashMap<String, Vec<Neighbor>>,
pub errors: HashMap<String, String>,
}
#[derive(Serialize, ToSchema, ToResponse)]
pub struct AppErrorResponse {
pub message: String,
}