Skip to content

Commit 032b03a

Browse files
authored
Merge pull request #44 from Mrmaxmeier/remove-parser-panic
Remove panic in Parser::next
2 parents 20df66f + 545a707 commit 032b03a

File tree

4 files changed

+27
-25
lines changed

4 files changed

+27
-25
lines changed

src/parser/document.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ fn parse_definition<'a>(parser: &mut Parser<'a>) -> UnlocatedParseResult<'a, Def
3131
Ok(Definition::Operation(try!(parse_operation_definition(parser)))),
3232
Token::Name("fragment") =>
3333
Ok(Definition::Fragment(try!(parse_fragment_definition(parser)))),
34-
_ => Err(parser.next().map(ParseError::UnexpectedToken)),
34+
_ => Err(parser.next()?.map(ParseError::UnexpectedToken)),
3535
}
3636
}
3737

@@ -130,7 +130,7 @@ fn parse_fragment<'a>(parser: &mut Parser<'a>) -> UnlocatedParseResult<'a, Selec
130130

131131
match parser.peek().item {
132132
Token::Name("on") => {
133-
parser.next();
133+
parser.next()?;
134134
let name = try!(parser.expect_name());
135135
let directives = try!(parse_directives(parser));
136136
let selection_set = try!(parse_selection_set(parser));
@@ -185,7 +185,7 @@ fn parse_fragment<'a>(parser: &mut Parser<'a>) -> UnlocatedParseResult<'a, Selec
185185
selection_set: selection_set.item,
186186
})))
187187
},
188-
_ => Err(parser.next().map(ParseError::UnexpectedToken)),
188+
_ => Err(parser.next()?.map(ParseError::UnexpectedToken)),
189189
}
190190
}
191191

@@ -244,9 +244,9 @@ fn parse_argument<'a>(parser: &mut Parser<'a>) -> ParseResult<'a, (Spanning<&'a
244244

245245
fn parse_operation_type<'a>(parser: &mut Parser<'a>) -> ParseResult<'a, OperationType> {
246246
match parser.peek().item {
247-
Token::Name("query") => Ok(parser.next().map(|_| OperationType::Query)),
248-
Token::Name("mutation") => Ok(parser.next().map(|_| OperationType::Mutation)),
249-
_ => Err(parser.next().map(ParseError::UnexpectedToken))
247+
Token::Name("query") => Ok(parser.next()?.map(|_| OperationType::Query)),
248+
Token::Name("mutation") => Ok(parser.next()?.map(|_| OperationType::Mutation)),
249+
_ => Err(parser.next()?.map(ParseError::UnexpectedToken))
250250
}
251251
}
252252

src/parser/parser.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,28 +54,31 @@ impl<'a> Parser<'a> {
5454
}
5555

5656
#[doc(hidden)]
57-
pub fn next(&mut self) -> Spanning<Token<'a>> {
57+
pub fn next(&mut self) -> ParseResult<'a, Token<'a>> {
5858
if self.tokens.len() == 1 {
59-
panic!("Can not parse over EOF marker");
59+
Err(Spanning::start_end(
60+
&self.peek().start.clone(),
61+
&self.peek().end.clone(),
62+
ParseError::UnexpectedEndOfFile))
63+
} else {
64+
Ok(self.tokens.remove(0))
6065
}
61-
62-
self.tokens.remove(0)
6366
}
6467

6568
#[doc(hidden)]
6669
pub fn expect(&mut self, expected: &Token) -> ParseResult<'a, Token<'a>> {
6770
if &self.peek().item != expected {
68-
Err(self.next().map(ParseError::UnexpectedToken))
71+
Err(self.next()?.map(ParseError::UnexpectedToken))
6972
}
7073
else {
71-
Ok(self.next())
74+
self.next()
7275
}
7376
}
7477

7578
#[doc(hidden)]
7679
pub fn skip(&mut self, expected: &Token) -> Result<Option<Spanning<Token<'a>>>, Spanning<ParseError<'a>>> {
7780
if &self.peek().item == expected {
78-
Ok(Some(self.next()))
81+
Ok(Some(self.next()?))
7982
}
8083
else if self.peek().item == Token::EndOfFile {
8184
Err(Spanning::zero_width(
@@ -151,7 +154,7 @@ impl<'a> Parser<'a> {
151154
pub fn expect_name(&mut self) -> ParseResult<'a, &'a str> {
152155
match *self.peek() {
153156
Spanning { item: Token::Name(_), .. } =>
154-
Ok(self.next().map(|token|
157+
Ok(self.next()?.map(|token|
155158
if let Token::Name(name) = token {
156159
name
157160
}
@@ -163,7 +166,7 @@ impl<'a> Parser<'a> {
163166
&self.peek().start.clone(),
164167
&self.peek().end.clone(),
165168
ParseError::UnexpectedEndOfFile)),
166-
_ => Err(self.next().map(ParseError::UnexpectedToken)),
169+
_ => Err(self.next()?.map(ParseError::UnexpectedToken)),
167170
}
168171
}
169172
}

src/parser/utils.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,7 @@ impl<T> PartialEq for Spanning<T> where T: PartialEq + fmt::Debug {
108108
}
109109
}
110110

111-
impl<T> Eq for Spanning<T> where T: Eq + fmt::Debug {
112-
}
111+
impl<T> Eq for Spanning<T> where T: Eq + fmt::Debug {}
113112

114113
impl<T> Hash for Spanning<T> where T: Hash + fmt::Debug {
115114
fn hash<H: Hasher>(&self, state: &mut H) {

src/parser/value.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,26 @@ pub fn parse_value_literal<'a>(parser: &mut Parser<'a>, is_const: bool) -> Parse
88
Spanning { item: Token::CurlyOpen, .. } => parse_object_literal(parser, is_const),
99
Spanning { item: Token::Dollar, .. } if !is_const => parse_variable_literal(parser),
1010
Spanning { item: Token::Int(i), .. } =>
11-
Ok(parser.next().map(|_| InputValue::int(i))),
11+
Ok(parser.next()?.map(|_| InputValue::int(i))),
1212
Spanning { item: Token::Float(f), .. } =>
13-
Ok(parser.next().map(|_| InputValue::float(f))),
13+
Ok(parser.next()?.map(|_| InputValue::float(f))),
1414
Spanning { item: Token::String(_), .. } =>
15-
Ok(parser.next().map(|t|
15+
Ok(parser.next()?.map(|t|
1616
if let Token::String(s) = t {
1717
InputValue::string(s)
1818
}
1919
else {
2020
panic!("Internal parser error");
2121
})),
2222
Spanning { item: Token::Name("true"), .. } =>
23-
Ok(parser.next().map(|_| InputValue::boolean(true))),
23+
Ok(parser.next()?.map(|_| InputValue::boolean(true))),
2424
Spanning { item: Token::Name("false"), .. } =>
25-
Ok(parser.next().map(|_| InputValue::boolean(false))),
25+
Ok(parser.next()?.map(|_| InputValue::boolean(false))),
2626
Spanning { item: Token::Name("null"), .. } =>
27-
Ok(parser.next().map(|_| InputValue::null())),
27+
Ok(parser.next()?.map(|_| InputValue::null())),
2828
Spanning { item: Token::Name(name), .. } =>
29-
Ok(parser.next().map(|_| InputValue::enum_value(name.to_owned()))),
30-
_ => Err(parser.next().map(ParseError::UnexpectedToken)),
29+
Ok(parser.next()?.map(|_| InputValue::enum_value(name.to_owned()))),
30+
_ => Err(parser.next()?.map(ParseError::UnexpectedToken)),
3131
}
3232
}
3333

0 commit comments

Comments
 (0)