csv/
csv.rs

1extern crate repsheet_etl;
2use std::fs::File;
3use std::io::prelude::*;
4use std::collections::HashMap;
5use std::collections::hash_map::Entry::{Vacant, Occupied};
6
7fn extract_or_zero(map: &mut HashMap<String, i64>, key: &str) -> i64 {
8    match map.entry(key.to_string()) {
9        Occupied(e) => return *e.get(),
10        Vacant(_)   => return 0,
11    }
12}
13
14fn write_csv(actors: &mut HashMap<String, repsheet_etl::actor::Actor>) {
15    let mut f = File::create("out.csv").unwrap();
16    let _ = f.write_all("address, number_of_requests, invalid_requests, GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE, CONNECT\n".as_bytes());
17    for (address, actor) in actors {
18        let gets    = extract_or_zero(&mut actor.methods, "GET");
19        let posts   = extract_or_zero(&mut actor.methods, "POST");
20        let puts    = extract_or_zero(&mut actor.methods, "PUT");
21        let deletes = extract_or_zero(&mut actor.methods, "DELETE");
22        let heads   = extract_or_zero(&mut actor.methods, "HEAD");
23        let options = extract_or_zero(&mut actor.methods, "OPTIONS");
24        let traces   = extract_or_zero(&mut actor.methods, "TRACE");
25        let connects = extract_or_zero(&mut actor.methods, "CONNECT");
26        let _ = f.write_all(format!("{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}\n",
27                                    address,
28                                    actor.request_count,
29                                    actor.invalid_request_count,
30                                    gets,
31                                    posts,
32                                    puts,
33                                    deletes,
34                                    heads,
35                                    options,
36                                    traces,
37                                    connects
38        ).as_bytes());
39    }
40}
41
42fn main() {
43    let _ = match repsheet_etl::process("access.log") {
44        Ok(mut actors) => { write_csv(&mut actors) },
45        Err(e) => println!("{}", e),
46    };
47}