1extern crate failure;
5#[macro_use] extern crate failure_derive;
6
7use failure::{Context, Fail, Backtrace};
8use std::fs::File;
9use std::io::prelude::*;
10
11
12#[derive(Debug)]
14pub struct Error {
15 inner: Context<ErrorKind>,
16}
17#[derive(Debug, Fail)]
19pub enum ErrorKind {
20 #[fail(display = "IoError")]
21 Io(#[cause] std::io::Error),
22 #[fail(display = "ParseError")]
23 Parse(#[cause] std::num::ParseIntError),
24 }
26
27impl Fail for Error {
28 fn cause(&self) -> Option<&Fail> {
29 self.inner.cause()
30 }
31 fn backtrace(&self) -> Option<&Backtrace> {
32 self.inner.backtrace()
33 }
34}
35
36impl std::fmt::Display for Error {
37 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
38 std::fmt::Display::fmt(&self.inner, f)
39 }
40}
41
42impl From<std::io::Error> for Error {
43 fn from(err: std::io::Error) -> Error {
44 Error { inner: Context::new(ErrorKind::Io(err)) }
45 }
46}
47
48impl From<std::num::ParseIntError> for Error {
49 fn from(err: std::num::ParseIntError) -> Error {
50 Error { inner: Context::new(ErrorKind::Parse(err)) }
51 }
52}
53
54type ParseResult<i32> = Result<i32, Error>;
55
56pub fn run(filename: Option<String>) -> ParseResult<i32> {
57 let mut file = File::open(filename.unwrap())?;
58
59 let mut contents = String::new();
60 file.read_to_string(&mut contents)?;
61 let mut sum = 0;
62 for c in contents.lines(){
63 let n: i32 = c.parse::<i32>()?;
64 sum += n;
65 }
66 Ok(sum)
67}