use crate::errors::{UtilesCoreError, UtilesCoreResult};
use crate::Tile;
#[must_use]
pub fn xyz2quadkey_vec(x: u32, y: u32, z: u8) -> Vec<u8> {
let mut qk_arr = Vec::with_capacity(z as usize);
for i in (0..z).rev() {
let mut digit: u8 = 0;
let mask = 1 << i;
if (x & mask) != 0 {
digit += 1;
}
if (y & mask) != 0 {
digit += 2;
}
qk_arr.push(digit);
}
qk_arr
}
#[must_use]
pub fn xyz2quadkey(x: u32, y: u32, z: u8) -> String {
xyz2quadkey_vec(x, y, z)
.iter()
.map(|&c| (c + b'0') as char)
.collect()
}
pub fn quadkey2xyz(quadkey: &str) -> UtilesCoreResult<(u32, u32, u8)> {
let mut x = 0;
let mut y = 0;
let mut z = 0;
for c in quadkey.chars() {
x <<= 1;
y <<= 1;
z += 1;
match c {
'0' => {}
'1' => {
x += 1;
}
'2' => {
y += 1;
}
'3' => {
x += 1;
y += 1;
}
_ => {
return Err(UtilesCoreError::InvalidQuadkey(c.to_string()));
}
}
}
Ok((x, y, z))
}
pub fn quadkey2tile(quadkey: &str) -> UtilesCoreResult<Tile> {
let xyz = quadkey2xyz(quadkey)?;
Ok(Tile::new(xyz.0, xyz.1, xyz.2))
}
#[must_use]
pub fn quadkey_flipy(quadkey: &str) -> String {
let mut quadkey_flipped = String::new();
for c in quadkey.chars() {
quadkey_flipped.push(match c {
'0' => '2',
'1' => '3',
'2' => '0',
'3' => '1',
_ => return String::new(),
});
}
quadkey_flipped
}