firebase_rs_sdk/firestore/model/
geo_point.rs

1use 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}