firebase_rs_sdk/firestore/model/
geo_point.rs1use crate::firestore::error::{invalid_argument, FirestoreResult};
2
3#[derive(Clone, Copy, Debug, PartialEq)]
4pub struct GeoPoint {
5 latitude: f64,
6 longitude: f64,
7}
8
9impl GeoPoint {
10 pub fn new(latitude: f64, longitude: f64) -> FirestoreResult<Self> {
11 if !(-90.0..=90.0).contains(&latitude) {
12 return Err(invalid_argument(
13 "Latitude must be between -90 and 90 degrees.",
14 ));
15 }
16 if !(-180.0..=180.0).contains(&longitude) {
17 return Err(invalid_argument(
18 "Longitude must be between -180 and 180 degrees.",
19 ));
20 }
21 Ok(Self {
22 latitude,
23 longitude,
24 })
25 }
26
27 pub fn latitude(&self) -> f64 {
28 self.latitude
29 }
30
31 pub fn longitude(&self) -> f64 {
32 self.longitude
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39
40 #[test]
41 fn valid_coordinates() {
42 let point = GeoPoint::new(10.0, 20.0).unwrap();
43 assert_eq!(point.latitude(), 10.0);
44 assert_eq!(point.longitude(), 20.0);
45 }
46
47 #[test]
48 fn invalid_latitude() {
49 let err = GeoPoint::new(100.0, 0.0).unwrap_err();
50 assert_eq!(err.code_str(), "firestore/invalid-argument");
51 }
52}