Skip to main content

kasane_logic/spatial_id/flex_id/
constructor.rs

1use crate::{Error, F_MAX, F_MIN, FlexId, MAX_ZOOM_LEVEL, SpatialIdError, TemporalId, XY_MAX};
2
3impl FlexId {
4    pub fn new(
5        f_zoomlevel: u8,
6        f_index: i32,
7        x_zoomlevel: u8,
8        x_index: u32,
9        y_zoomlevel: u8,
10        y_index: u32,
11    ) -> Result<FlexId, Error> {
12        if f_zoomlevel > MAX_ZOOM_LEVEL as u8 {
13            return Err(SpatialIdError::ZOutOfRange { z: f_zoomlevel }.into());
14        }
15
16        if x_zoomlevel > MAX_ZOOM_LEVEL as u8 {
17            return Err(SpatialIdError::ZOutOfRange { z: x_zoomlevel }.into());
18        }
19
20        if y_zoomlevel > MAX_ZOOM_LEVEL as u8 {
21            return Err(SpatialIdError::ZOutOfRange { z: y_zoomlevel }.into());
22        }
23
24        if f_index < F_MIN[f_zoomlevel as usize] || f_index > F_MAX[f_zoomlevel as usize] {
25            return Err(SpatialIdError::FOutOfRange {
26                z: f_zoomlevel,
27                f: f_index,
28            }
29            .into());
30        }
31
32        if x_index > XY_MAX[x_zoomlevel as usize] {
33            return Err(SpatialIdError::XOutOfRange {
34                z: x_zoomlevel,
35                x: x_index,
36            }
37            .into());
38        }
39
40        if y_index > XY_MAX[y_zoomlevel as usize] {
41            return Err(SpatialIdError::YOutOfRange {
42                z: y_zoomlevel,
43                y: y_index,
44            }
45            .into());
46        }
47
48        Ok(FlexId {
49            f_zoomlevel,
50            f_index,
51            x_zoomlevel,
52            x_index,
53            y_zoomlevel,
54            y_index,
55            temporal_id: TemporalId::WHOLE,
56        })
57    }
58
59    pub unsafe fn new_unchecked(
60        f_zoomlevel: u8,
61        f_index: i32,
62        x_zoomlevel: u8,
63        x_index: u32,
64        y_zoomlevel: u8,
65        y_index: u32,
66    ) -> FlexId {
67        FlexId {
68            f_zoomlevel,
69            f_index,
70            x_zoomlevel,
71            x_index,
72            y_zoomlevel,
73            y_index,
74            temporal_id: TemporalId::WHOLE,
75        }
76    }
77
78    #[cfg(feature = "temporal_id")]
79    pub fn new_with_temporal(
80        f_zoomlevel: u8,
81        f_index: i32,
82        x_zoomlevel: u8,
83        x_index: u32,
84        y_zoomlevel: u8,
85        y_index: u32,
86        temporal_id: TemporalId,
87    ) -> Result<FlexId, Error> {
88        if f_zoomlevel > MAX_ZOOM_LEVEL as u8 {
89            return Err(SpatialIdError::ZOutOfRange { z: f_zoomlevel }.into());
90        }
91
92        if x_zoomlevel > MAX_ZOOM_LEVEL as u8 {
93            return Err(SpatialIdError::ZOutOfRange { z: x_zoomlevel }.into());
94        }
95
96        if y_zoomlevel > MAX_ZOOM_LEVEL as u8 {
97            return Err(SpatialIdError::ZOutOfRange { z: y_zoomlevel }.into());
98        }
99
100        if f_index < F_MIN[f_zoomlevel as usize] || f_index > F_MAX[f_zoomlevel as usize] {
101            return Err(SpatialIdError::FOutOfRange {
102                z: f_zoomlevel,
103                f: f_index,
104            }
105            .into());
106        }
107
108        if x_index > XY_MAX[x_zoomlevel as usize] {
109            return Err(SpatialIdError::XOutOfRange {
110                z: x_zoomlevel,
111                x: x_index,
112            }
113            .into());
114        }
115
116        if y_index > XY_MAX[y_zoomlevel as usize] {
117            return Err(SpatialIdError::YOutOfRange {
118                z: y_zoomlevel,
119                y: y_index,
120            }
121            .into());
122        }
123
124        Ok(FlexId {
125            f_zoomlevel,
126            f_index,
127            x_zoomlevel,
128            x_index,
129            y_zoomlevel,
130            y_index,
131
132            temporal_id,
133        })
134    }
135
136    #[cfg(feature = "temporal_id")]
137    pub unsafe fn new_with_temporal_unchecked(
138        f_zoomlevel: u8,
139        f_index: i32,
140        x_zoomlevel: u8,
141        x_index: u32,
142        y_zoomlevel: u8,
143        y_index: u32,
144        temporal_id: TemporalId,
145    ) -> FlexId {
146        FlexId {
147            f_zoomlevel,
148            f_index,
149            x_zoomlevel,
150            x_index,
151            y_zoomlevel,
152            y_index,
153            temporal_id,
154        }
155    }
156}