// run-pass
#![allow(deprecated)] // for deprecated `try!()` macro
use std::num::{ParseFloatError, ParseIntError};

fn main() {
    assert_eq!(simple(), Ok(1));
    assert_eq!(nested(), Ok(2));
    assert_eq!(merge_ok(), Ok(3.0));
    assert_eq!(merge_int_err(), Err(Error::Int));
    assert_eq!(merge_float_err(), Err(Error::Float));
}

fn simple() -> Result<i32, ParseIntError> {
    Ok(try!("1".parse()))
}

fn nested() -> Result<i32, ParseIntError> {
    Ok(try!(try!("2".parse::<i32>()).to_string().parse::<i32>()))
}

fn merge_ok() -> Result<f32, Error> {
    Ok(try!("1".parse::<i32>()) as f32 + try!("2.0".parse::<f32>()))
}

fn merge_int_err() -> Result<f32, Error> {
    Ok(try!("a".parse::<i32>()) as f32 + try!("2.0".parse::<f32>()))
}

fn merge_float_err() -> Result<f32, Error> {
    Ok(try!("1".parse::<i32>()) as f32 + try!("b".parse::<f32>()))
}

#[derive(Debug, PartialEq)]
enum Error {
    Int,
    Float,
}

impl From<ParseIntError> for Error {
    fn from(_: ParseIntError) -> Error {
        Error::Int
    }
}

impl From<ParseFloatError> for Error {
    fn from(_: ParseFloatError) -> Error {
        Error::Float
    }
}
