use crate::{
api::{
geo::conf::{
GeoPoint, GeoRadiusOption, GeoSearch, GeoSearchStoreOption, GeoShape, OriginPoint,
},
key::Key,
zset::{conf::ZAdd, traits::ZSet},
},
error::Result,
};
pub trait Geo: ZSet + Key {
fn geoadd<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
items: &[(f64, f64, M)],
) -> Result<usize>;
fn geoadd_opts<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
items: &[(f64, f64, M)],
options: impl AsRef<[ZAdd]>,
) -> Result<usize>;
fn geodist<K: AsRef<[u8]>, M1: AsRef<[u8]>, M2: AsRef<[u8]>>(
&self,
key: K,
member1: M1,
member2: M2,
unit: Option<&str>,
) -> Result<Option<f64>>;
fn geopos<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
members: &[M],
) -> Result<Vec<Option<(f64, f64)>>>;
fn geohash<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
members: &[M],
) -> Result<Vec<Option<String>>>;
fn georadius<K: AsRef<[u8]>>(
&self,
key: K,
longitude: f64,
latitude: f64,
radius: f64,
opt: &GeoRadiusOption,
) -> Result<Vec<GeoPoint>>;
fn georadiusbymember<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
member: M,
radius: f64,
opt: &GeoRadiusOption,
) -> Result<Vec<GeoPoint>>;
fn geosearch<K: AsRef<[u8]>>(
&self,
key: K,
origin: &OriginPoint,
shape: &mut GeoShape,
opt: &GeoSearch,
) -> Result<Vec<GeoPoint>>;
fn geosearchstore<K: AsRef<[u8]>, D: AsRef<[u8]>>(
&self,
destination: D,
source: K,
origin: &OriginPoint,
shape: &mut GeoShape,
opt: &GeoSearchStoreOption,
) -> Result<usize>;
}