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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
// Copyright 2015 Till Höppner
//
// 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.
#![feature(libc, plugin)]
#![plugin(regex_macros)]
extern crate ilc;
extern crate chrono;
extern crate docopt;
extern crate rustc_serialize;
extern crate libc;
extern crate regex;
#[macro_use]
extern crate log;
extern crate env_logger;
use std::process;
use std::io::{ self, BufReader };
use std::fs::File;
use std::error::Error;
use std::str::FromStr;
use docopt::Docopt;
use chrono::offset::fixed::FixedOffset;
use chrono::naive::date::NaiveDate;
use ilc::context::Context;
use ilc::format::{ self, Encode, Decode, DecodeBox };
static USAGE: &'static str = r#"
d8b 888
Y8P 888
888
888 888 .d8888b
888 888 d88P"
888 888 888
888 888 Y88b.
888 888 "Y8888P
A converter and statistics utility for IRC log files.
Usage:
ilc parse <file>...
ilc convert <informat> <outformat> [--date DATE] [--tz SECS] [--channel CH]
ilc (-h | --help | -v | --version)
Options:
-h --help Show this screen.
-v --version Show the version (duh).
--date DATE Override the date for this log. ISO 8601, YYYY-MM-DD.
--tz SECONDS UTC offset in the direction of the western hemisphere. [default: 0]
--channel CH Set a channel for the given log.
"#;
#[derive(RustcDecodable, Debug)]
struct Args {
cmd_parse: bool,
cmd_convert: bool,
arg_file: Vec<String>,
arg_informat: Option<String>,
arg_outformat: Option<String>,
flag_help: bool,
flag_version: bool,
flag_date: Option<String>,
flag_tz: i32,
flag_channel: Option<String>
}
fn error(e: Box<Error>) -> ! {
println!("{}", e.description());
let mut e = e.cause();
while let Some(err) = e {
println!("\t{}", err.description());
e = err.cause();
}
process::exit(1)
}
fn main() {
env_logger::init().unwrap();
let args: Args = Docopt::new(USAGE)
.and_then(|d| d.decode())
.unwrap_or_else(|e| e.exit());
if args.flag_help {
println!("{}", USAGE);
process::exit(1)
}
let context = Context {
timezone: FixedOffset::west(args.flag_tz),
override_date: args.flag_date.and_then(|d| NaiveDate::from_str(&d).ok()),
channel: args.flag_channel.clone()
};
if args.cmd_parse {
let mut parser = format::energymech::Energymech;
let formatter = format::binary::Binary;
for file in args.arg_file {
let f: BufReader<File> = BufReader::new(File::open(file).unwrap());
let iter = parser.decode(&context, f);
for e in iter {
info!("Parsed: {:?}", e);
drop(formatter.encode(&context, io::stdout(), &e.unwrap()));
}
}
}
if args.cmd_convert {
let stdin = io::stdin();
let informat = args.arg_informat.expect("Must provide informat");
let outformat = args.arg_outformat.expect("Must provide outformat");
let mut decoder = format::decoder(&informat).expect("Decoder not available");
let encoder = format::encoder(&outformat).expect("Encoder not available");
let mut lock = stdin.lock();
for e in decoder.decode_box(&context, &mut lock) {
match e {
Ok(e) => {
let _ = encoder.encode(&context, &mut io::stdout(), &e);
},
Err(e) => error(Box::new(e))
}
}
}
}
|