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}