use crate::constants::MAX_CELL_BNDRY_VERTS;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "serde")]
use serde_repr::{Deserialize_repr, Serialize_repr};
#[repr(transparent)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct H3Index(pub u64);
pub const H3_NULL: H3Index = H3Index(0);
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct LatLng {
pub lat: f64,
pub lng: f64,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct CellBoundary {
pub num_verts: usize,
pub verts: [LatLng; MAX_CELL_BNDRY_VERTS],
}
impl Default for CellBoundary {
fn default() -> Self {
Self {
num_verts: 0,
verts: [LatLng::default(); MAX_CELL_BNDRY_VERTS],
}
}
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct GeoLoop {
pub num_verts: usize,
pub verts: Vec<LatLng>,
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct GeoPolygon {
pub geoloop: GeoLoop,
pub num_holes: usize,
pub holes: Vec<GeoLoop>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
#[cfg_attr(feature = "serde", derive(Serialize_repr, Deserialize_repr))]
#[allow(clippy::enum_variant_names)] pub enum H3Error {
Success = 0,
Failed = 1,
Domain = 2,
LatLngDomain = 3,
ResDomain = 4,
CellInvalid = 5,
DirEdgeInvalid = 6,
UndirEdgeInvalid = 7,
VertexInvalid = 8,
Pentagon = 9,
DuplicateInput = 10,
NotNeighbors = 11,
ResMismatch = 12,
MemoryAlloc = 13,
MemoryBounds = 14,
OptionInvalid = 15,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct CoordIJ {
pub i: i32,
pub j: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct CoordIJK {
pub i: i32,
pub j: i32,
pub k: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct FaceIJK {
pub face: i32,
pub coord: CoordIJK,
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Vec2d {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Vec3d {
pub x: f64,
pub y: f64,
pub z: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Hash)]
#[repr(u8)]
#[cfg_attr(feature = "serde", derive(Serialize_repr, Deserialize_repr))]
pub enum Direction {
Center = 0,
KAxes = 1,
JAxes = 2,
JkAxes = 3, IAxes = 4,
IkAxes = 5, IjAxes = 6, InvalidDigit = 7,
}
impl Default for Direction {
fn default() -> Self {
Direction::Center
}
}
impl TryFrom<u8> for Direction {
type Error = H3Error;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Direction::Center),
1 => Ok(Direction::KAxes),
2 => Ok(Direction::JAxes),
3 => Ok(Direction::JkAxes),
4 => Ok(Direction::IAxes),
5 => Ok(Direction::IkAxes),
6 => Ok(Direction::IjAxes),
7 => Ok(Direction::InvalidDigit), _ => Err(H3Error::Domain), }
}
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BBox {
pub north: f64,
pub south: f64,
pub east: f64,
pub west: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)] #[cfg_attr(feature = "serde", derive(Serialize_repr, Deserialize_repr))]
pub enum ContainmentMode {
Center = 0,
Full = 1,
Overlapping = 2,
OverlappingBbox = 3,
Invalid = 4,
}
impl Default for ContainmentMode {
fn default() -> Self {
ContainmentMode::Center }
}
impl TryFrom<u32> for ContainmentMode {
type Error = H3Error;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(ContainmentMode::Center),
1 => Ok(ContainmentMode::Full),
2 => Ok(ContainmentMode::Overlapping),
3 => Ok(ContainmentMode::OverlappingBbox),
_ => Err(H3Error::OptionInvalid), }
}
}