use bitcode::{Decode, Encode};
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Default,
Encode,
Decode,
strum::Display,
strum::EnumString,
strum::FromRepr,
)]
#[strum(ascii_case_insensitive)]
pub enum DistanceUnit {
#[default]
#[strum(serialize = "m", serialize = "meters")]
Meters,
#[strum(serialize = "km", serialize = "kilometers")]
Kilometers,
#[strum(serialize = "mi", serialize = "miles")]
Miles,
#[strum(serialize = "ft", serialize = "feet")]
Feet,
}
impl DistanceUnit {
#[inline]
pub fn parse(s: &str) -> Option<Self> {
s.parse().ok()
}
#[inline]
pub const fn conversion_factor(&self) -> f64 {
match self {
Self::Meters => 1.0,
Self::Kilometers => 1000.0,
Self::Miles => 1609.34,
Self::Feet => 0.3048,
}
}
#[inline]
pub const fn to_meters(&self, dist: f64) -> f64 {
dist * self.conversion_factor()
}
#[inline]
pub const fn from_meters(&self, meters: f64) -> f64 {
meters / self.conversion_factor()
}
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Default,
Encode,
Decode,
strum::Display,
strum::EnumString,
strum::FromRepr,
)]
#[strum(ascii_case_insensitive)]
pub enum DistanceSort {
#[default]
None,
#[strum(serialize = "asc", serialize = "ASC")]
Asc,
#[strum(serialize = "desc", serialize = "DESC")]
Desc,
}
impl DistanceSort {
#[inline]
pub fn parse(s: &str) -> Option<Self> {
s.parse().ok()
}
}
#[derive(Debug, Clone, PartialEq, Encode, Decode)]
pub enum OriginPoint {
Coord { lon: f64, lat: f64 },
Member(String),
}
impl OriginPoint {
#[inline]
pub const fn coord(lon: f64, lat: f64) -> Self {
Self::Coord { lon, lat }
}
#[inline]
pub fn member(m: impl Into<String>) -> Self {
Self::Member(m.into())
}
}
#[derive(Debug, Clone, PartialEq, Default, Encode, Decode)]
pub struct GeoPoint {
pub longitude: f64,
pub latitude: f64,
pub member: String,
pub dist: f64,
pub score: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct GeoHashBits {
pub bits: u64,
pub step: u8,
}
impl GeoHashBits {
#[inline]
pub const fn is_zero(&self) -> bool {
self.bits == 0 && self.step == 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct GeoHashRange {
pub min: f64,
pub max: f64,
}
impl GeoHashRange {
#[inline]
pub const fn is_zero(&self) -> bool {
self.min == 0.0 && self.max == 0.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct GeoHashArea {
pub hash: GeoHashBits,
pub latitude: GeoHashRange,
pub longitude: GeoHashRange,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct GeoHashNeighbors {
pub north: GeoHashBits,
pub east: GeoHashBits,
pub west: GeoHashBits,
pub south: GeoHashBits,
pub north_east: GeoHashBits,
pub south_east: GeoHashBits,
pub north_west: GeoHashBits,
pub south_west: GeoHashBits,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct GeoHashRadius {
pub hash: GeoHashBits,
pub area: GeoHashArea,
pub neighbors: GeoHashNeighbors,
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Default,
Encode,
Decode,
strum::Display,
strum::EnumString,
strum::FromRepr,
)]
#[strum(ascii_case_insensitive)]
pub enum GeoShapeType {
#[default]
None,
Circular,
Rectangular,
}
#[derive(Debug, Clone, PartialEq, Default, Encode, Decode)]
pub struct GeoShape {
pub shape_type: GeoShapeType,
pub center_lon: f64,
pub center_lat: f64,
pub radius: f64,
pub width: f64,
pub height: f64,
pub conversion: f64,
pub bounds: [f64; 4],
}
#[derive(Debug, Clone, PartialEq, Default, Encode, Decode)]
pub struct GeoRadius {
pub with_coord: bool,
pub with_dist: bool,
pub with_hash: bool,
pub count: Option<usize>,
pub any: bool,
pub sort: DistanceSort,
pub store_key: Option<String>,
pub store_dist_key: Option<String>,
pub unit: DistanceUnit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GeoSearch {
WithCoord,
WithDist,
WithHash,
Count(usize),
Any,
Asc,
Desc,
Unit(DistanceUnit),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GeoSearchStore {
Count(usize),
Any,
Asc,
Desc,
StoreDist,
Unit(DistanceUnit),
}