1 // Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
12 // ignore-cloudabi no std::fs
15 use std::io::{Read, self};
16 use std::num::ParseIntError;
17 use std::str::FromStr;
19 fn on_method() -> Result<i32, ParseIntError> {
20 Ok("1".parse::<i32>()? + "2".parse::<i32>()?)
23 fn in_chain() -> Result<String, ParseIntError> {
24 Ok("3".parse::<i32>()?.to_string())
27 fn on_call() -> Result<i32, ParseIntError> {
28 fn parse<T: FromStr>(s: &str) -> Result<T, T::Err> {
35 fn nested() -> Result<i32, ParseIntError> {
36 Ok("5".parse::<i32>()?.to_string().parse()?)
39 fn on_path() -> Result<i32, ParseIntError> {
40 let x = "6".parse::<i32>();
45 fn on_macro() -> Result<i32, ParseIntError> {
50 Ok(id!("7".parse::<i32>())?)
53 fn on_parens() -> Result<i32, ParseIntError> {
54 let x = "8".parse::<i32>();
59 fn on_block() -> Result<i32, ParseIntError> {
60 let x = "9".parse::<i32>();
65 fn on_field() -> Result<i32, ParseIntError> {
66 struct Pair<A, B> { a: A, b: B }
68 let x = Pair { a: "10".parse::<i32>(), b: 0 };
73 fn on_tuple_field() -> Result<i32, ParseIntError> {
74 let x = ("11".parse::<i32>(), 0);
79 fn on_try() -> Result<i32, ParseIntError> {
80 let x = "12".parse::<i32>().map(|i| i.to_string().parse::<i32>());
85 fn on_binary_op() -> Result<i32, ParseIntError> {
86 let x = 13 - "14".parse::<i32>()?;
87 let y = "15".parse::<i32>()? - 16;
88 let z = "17".parse::<i32>()? - "18".parse::<i32>()?;
93 fn on_index() -> Result<i32, ParseIntError> {
95 let y = "0".parse::<usize>();
100 fn on_args() -> Result<i32, ParseIntError> {
101 fn sub(x: i32, y: i32) -> i32 { x - y }
103 let x = "20".parse();
104 let y = "21".parse();
109 fn on_if() -> Result<i32, ParseIntError> {
117 fn on_if_let() -> Result<i32, ParseIntError> {
118 Ok(if let Ok(..) = "24".parse::<i32>() {
125 fn on_match() -> Result<i32, ParseIntError> {
126 Ok(match "27".parse::<i32>() {
127 Err(..) => "28".parse::<i32>(),
128 Ok(..) => "29".parse::<i32>(),
132 fn tight_binding() -> Result<bool, ()> {
133 fn ok<T>(x: T) -> Result<T, ()> { Ok(x) }
140 fn merge_error() -> Result<i32, Error> {
141 let mut s = String::new();
143 File::open("foo.txt")?.read_to_string(&mut s)?;
145 Ok(s.parse::<i32>()? + 1)
149 assert_eq!(Ok(3), on_method());
151 assert_eq!(Ok("3".to_string()), in_chain());
153 assert_eq!(Ok(4), on_call());
155 assert_eq!(Ok(5), nested());
157 assert_eq!(Ok(6), on_path());
159 assert_eq!(Ok(7), on_macro());
161 assert_eq!(Ok(8), on_parens());
163 assert_eq!(Ok(9), on_block());
165 assert_eq!(Ok(10), on_field());
167 assert_eq!(Ok(11), on_tuple_field());
169 assert_eq!(Ok(12), on_try());
171 assert_eq!(Ok(-3), on_binary_op());
173 assert_eq!(Ok(19), on_index());
175 assert_eq!(Ok(-1), on_args());
177 assert_eq!(Ok(22), on_if());
179 assert_eq!(Ok(25), on_if_let());
181 assert_eq!(Ok(29), on_match());
183 assert_eq!(Ok(false), tight_binding());
188 Parse(ParseIntError),
191 impl From<io::Error> for Error {
192 fn from(e: io::Error) -> Error {
197 impl From<ParseIntError> for Error {
198 fn from(e: ParseIntError) -> Error {