1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//! 
//! Simple conversion between different coordinate systems
//! without external wrappers injection
//!
//! # Code Example
//! ```
//! extern crate geomorph;
//! use geomorph::*;
//! 
//! fn try_main() -> Result<coord::Coord, ParseError> {
//!     let lat: f64 = -23.0095839;
//!     let lon: f64 = -43.4361816;
//!     
//!     coord::Coord::new(&lat, &lon)
//! }
//! 
//! fn try_main_utm(coord: &coord::Coord)-> Result<utm::Utm, ParseError> {
//!     utm::Utm::from_coord(coord)
//! }
//! 
//! fn main() {
//!     let coord = try_main().unwrap();
//!     let utm = try_main_utm(&coord).unwrap();
//!     println!("coord: {}", coord);
//!     println!("utm: {}", utm);
//!     // Will print:
//!     //  coord: (-23.0095839, -43.4361816)
//!     //  utm: 23K 660265 7454564
//! }
//! ```

use std::error::Error;
use std::fmt;

/// Mathematical auxiliary functions
pub mod math;
/// Datum conventions
pub mod datum;
/// Latitude and longitude coordinates
pub mod coord;
/// Universal Transverse Mercator (UTM)
pub mod utm;
/// Military Grid Reference System (MGRS)
pub mod mgrs;

#[derive(Debug)]
pub struct ParseError {
}

impl fmt::Display for ParseError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Parse error!")
    }
}

impl Error for ParseError {
    fn description(&self) -> &str {
        "Parse error with the provided information!"
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn full_test() {
        let lat: f64 = -23.0095839;
        let lon: f64 = -43.4361816;
        let coord = coord::Coord::new(&lat, &lon).unwrap();
        let utm = coord.to_utm().unwrap();
        let coord2 = utm.to_coord().unwrap();

        println!("coord: {}, utm: {}, coord2: {}", coord, utm, coord2);
    }
}