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
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright 2015 The GeoRust Developers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//	http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#![no_std]

//! ```rust
//! use world_file::WorldFile;
//!
//! let world_file_txt = "\
//! 32.0
//! 0.0
//! 0.0
//! -32.0
//! 691200.0
//! 4576000.0";
//!
//! let world_file: WorldFile = world_file_txt.parse().unwrap();
//!
//! assert_eq!(world_file.x_scale, 32.0);
//! assert_eq!(world_file.y_skew, 0.0);
//! assert_eq!(world_file.x_skew, 0.0);
//! assert_eq!(world_file.y_scale, -32.0);
//! assert_eq!(world_file.x_coord, 691200.0);
//! assert_eq!(world_file.y_coord, 4576000.0);
//! ```

use core::str::FromStr;

pub struct WorldFile {
    pub x_scale: f64,
    pub y_skew: f64,
    pub x_skew: f64,
    pub y_scale: f64,
    pub x_coord: f64,
    pub y_coord: f64,
}

impl FromStr for WorldFile {
    type Err = ();
    fn from_str(s: &str) -> Result<Self, ()> {
        let mut lines = s.lines();

        // size of pixel in x direction (x_scale)
        let x_scale: f64 = match lines.next() {
            Some(s) => match FromStr::from_str(s) {
                Ok(i) => i,
                Err(_) => return Err(()),
            },
            None => return Err(()),
        };

        // rotation term for row (y_skew)
        let y_skew: f64 = match lines.next() {
            Some(s) => match FromStr::from_str(s) {
                Ok(i) => i,
                Err(_) => return Err(()),
            },
            None => return Err(()),
        };

        // rotation term for column (x_skew)
        let x_skew: f64 = match lines.next() {
            Some(s) => match FromStr::from_str(s) {
                Ok(i) => i,
                Err(_) => return Err(()),
            },
            None => return Err(()),
        };

        // size of pixel in y direction (y_scale)
        let y_scale: f64 = match lines.next() {
            Some(s) => match FromStr::from_str(s) {
                Ok(i) => i,
                Err(_) => return Err(()),
            },
            None => return Err(()),
        };

        // x coordinate of centre of upper left pixel in map units (x_coord)
        let x_coord: f64 = match lines.next() {
            Some(s) => match FromStr::from_str(s) {
                Ok(i) => i,
                Err(_) => return Err(()),
            },
            None => return Err(()),
        };

        // y coordinate of centre of upper left pixel in map units (y_coord)
        let y_coord: f64 = match lines.next() {
            Some(s) => match FromStr::from_str(s) {
                Ok(i) => i,
                Err(_) => return Err(()),
            },
            None => return Err(()),
        };

        Ok(WorldFile {
            x_scale: x_scale,
            y_skew: y_skew,
            x_skew: x_skew,
            y_scale: y_scale,
            x_coord: x_coord,
            y_coord: y_coord,
        })
    }
}