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
use csv;
use std::error::Error;
use std::io::Read;

use model::{Order, OrderList, Time, TravelTime, TIME_PER_MINUTE, TIME_PER_SECOND};

pub fn parse_distances<R: Read>(file: R) -> Result<TravelTime, Box<Error>> {
    let mut csv = csv::ReaderBuilder::new().delimiter(b';').from_reader(file);
    let mut result = TravelTime::new();
    for row in csv.records() {
        let row = row?;
        let from_id = row[0].parse()?;
        let to_id = row[1].parse()?;
        let time: Time = row[3].parse()?;

        result.insert((from_id, to_id), time * TIME_PER_SECOND);
    }

    Ok(result)
}

pub fn parse_orders<R: Read>(file: R) -> Result<OrderList, Box<Error>> {
    let mut csv = csv::ReaderBuilder::new().delimiter(b';').from_reader(file);
    let mut result = OrderList::new();
    for row in csv.records() {
        let row = row?;
        let id = row[0].parse()?;
        let frequency = row[2][..1].parse()?;
        let container_count: i32 = row[3].parse()?;
        let container_volume: i32 = row[4].parse()?;
        let duration: f32 = row[5].parse()?;
        let location_id = row[6].parse()?;
        let volume = (container_count * container_volume) / 5;

        result.insert(
            id,
            Order {
                location_id: location_id,
                frequency: frequency,
                duration: (duration * TIME_PER_MINUTE as f32).round() as Time,
                volume: volume,
            },
        );
    }

    Ok(result)
}