1use self::Error::*;
40use lexer::{self, Lexer, Token};
41use range::{Op, Predicate, Range, WildcardVersion};
42use std::error;
43use std::fmt;
44use std::mem;
45use version::{Identifier, Version};
46
47macro_rules! has_ws_separator {
49 ($slf:expr, $pat:pat) => {{
50 $slf.skip_whitespace()?;
51
52 match $slf.peek() {
53 $pat => {
54 $slf.pop()?;
56 $slf.skip_whitespace()?;
58 true
59 }
60 _ => false,
61 }
62 }};
63}
64
65#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
66pub enum Error<'input> {
67 UnexpectedEnd,
69 UnexpectedToken(Token<'input>),
71 Lexer(lexer::Error),
73 MoreInput(Vec<Token<'input>>),
75 EmptyPredicate,
77 EmptyRange,
79}
80
81impl<'input> fmt::Display for Error<'input> {
82 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
83 match *self {
84 UnexpectedEnd => write!(fmt, "unexpected end"),
85 UnexpectedToken(ref t) => write!(fmt, "unexpected token: {:?}", t),
86 Lexer(ref l) => write!(fmt, "lexer error: {}", l),
87 MoreInput(..) => write!(fmt, "more input"),
88 EmptyPredicate => write!(fmt, "empty predicate"),
89 EmptyRange => write!(fmt, "empty range"),
90 }
91 }
92}
93
94impl<'input> error::Error for Error<'input> {
95 fn description(&self) -> &str {
96 match *self {
97 UnexpectedEnd => "unexpected end",
98 UnexpectedToken(..) => "unexpected token",
99 Lexer(ref l) => l.description(),
100 MoreInput(..) => "more input",
101 EmptyPredicate => "empty predicate",
102 EmptyRange => "empty range",
103 }
104 }
105}
106
107impl<'input> From<lexer::Error> for Error<'input> {
108 fn from(value: lexer::Error) -> Self {
109 Error::Lexer(value)
110 }
111}
112
113impl<'input> From<Error<'input>> for String {
115 fn from(value: Error<'input>) -> Self {
116 value.to_string()
117 }
118}
119
120pub struct Parser<'input> {
122 lexer: Lexer<'input>,
124 c1: Option<Token<'input>>,
126}
127
128impl<'input> Parser<'input> {
129 pub fn new(input: &'input str) -> Result<Parser<'input>, Error<'input>> {
131 let mut lexer = Lexer::new(input);
132
133 let c1 = if let Some(c1) = lexer.next() {
134 Some(c1?)
135 } else {
136 None
137 };
138
139 Ok(Parser {
140 lexer: lexer,
141 c1: c1,
142 })
143 }
144
145 #[inline(always)]
147 fn pop(&mut self) -> Result<Token<'input>, Error<'input>> {
148 let c1 = if let Some(c1) = self.lexer.next() {
149 Some(c1?)
150 } else {
151 None
152 };
153
154 mem::replace(&mut self.c1, c1).ok_or_else(|| UnexpectedEnd)
155 }
156
157 #[inline(always)]
159 fn peek(&mut self) -> Option<&Token<'input>> {
160 self.c1.as_ref()
161 }
162
163 fn skip_whitespace(&mut self) -> Result<(), Error<'input>> {
165 match self.peek() {
166 Some(&Token::Whitespace(_, _)) => self.pop().map(|_| ()),
167 _ => Ok(()),
168 }
169 }
170
171 pub fn comma_predicate(&mut self) -> Result<Option<Predicate>, Error<'input>> {
173 if !has_ws_separator!(self, Some(&Token::Comma)) {
174 return Ok(None);
175 }
176
177 if let Some(predicate) = self.predicate()? {
178 Ok(Some(predicate))
179 } else {
180 Err(EmptyPredicate)
181 }
182 }
183
184 pub fn component(&mut self) -> Result<Option<u64>, Error<'input>> {
188 match self.pop()? {
189 Token::Numeric(number) => Ok(Some(number)),
190 ref t if t.is_wildcard() => Ok(None),
191 tok => Err(UnexpectedToken(tok)),
192 }
193 }
194
195 pub fn numeric(&mut self) -> Result<u64, Error<'input>> {
197 match self.pop()? {
198 Token::Numeric(number) => Ok(number),
199 tok => Err(UnexpectedToken(tok)),
200 }
201 }
202
203 pub fn dot_component(&mut self) -> Result<(Option<u64>, bool), Error<'input>> {
212 match self.peek() {
213 Some(&Token::Dot) => {}
214 _ => return Ok((None, false)),
215 }
216
217 self.pop()?;
219 self.component().map(|n| (n, n.is_none()))
220 }
221
222 pub fn dot_numeric(&mut self) -> Result<u64, Error<'input>> {
224 match self.pop()? {
225 Token::Dot => {}
226 tok => return Err(UnexpectedToken(tok)),
227 }
228
229 self.numeric()
230 }
231
232 pub fn identifier(&mut self) -> Result<Identifier, Error<'input>> {
236 let identifier = match self.pop()? {
237 Token::AlphaNumeric(identifier) => {
238 Identifier::AlphaNumeric(identifier.to_string())
240 }
241 Token::Numeric(n) => Identifier::Numeric(n),
242 tok => return Err(UnexpectedToken(tok)),
243 };
244
245 Ok(identifier)
246 }
247
248 fn pre(&mut self) -> Result<Vec<Identifier>, Error<'input>> {
252 match self.peek() {
253 Some(&Token::Hyphen) => {}
254 _ => return Ok(vec![]),
255 }
256
257 self.pop()?;
259 self.parts()
260 }
261
262 fn parts(&mut self) -> Result<Vec<Identifier>, Error<'input>> {
264 let mut parts = Vec::new();
265
266 parts.push(self.identifier()?);
267
268 loop {
269 match self.peek() {
270 Some(&Token::Dot) | Some(&Token::Hyphen) => {}
271 _ => break,
272 }
273
274 self.pop()?;
276
277 parts.push(self.identifier()?);
278 }
279
280 Ok(parts)
281 }
282
283 fn plus_build_metadata(&mut self) -> Result<Vec<Identifier>, Error<'input>> {
287 match self.peek() {
288 Some(&Token::Plus) => {}
289 _ => return Ok(vec![]),
290 }
291
292 self.pop()?;
294 self.parts()
295 }
296
297 pub fn op(&mut self) -> Result<Op, Error<'input>> {
301 use self::Token::*;
302
303 let op = match self.peek() {
304 Some(&Eq) => Op::Ex,
305 Some(&Gt) => Op::Gt,
306 Some(&GtEq) => Op::GtEq,
307 Some(&Lt) => Op::Lt,
308 Some(&LtEq) => Op::LtEq,
309 Some(&Tilde) => Op::Tilde,
310 Some(&Caret) => Op::Compatible,
311 _ => return Ok(Op::Compatible),
313 };
314
315 self.pop()?;
317 self.skip_whitespace()?;
318 Ok(op)
319 }
320
321 pub fn predicate(&mut self) -> Result<Option<Predicate>, Error<'input>> {
325 if self.peek().is_none() {
327 return Ok(None);
328 }
329
330 let mut op = self.op()?;
331
332 let major = match self.component()? {
333 Some(major) => major,
334 None => return Ok(None),
335 };
336
337 let (minor, minor_wildcard) = self.dot_component()?;
338 let (patch, patch_wildcard) = self.dot_component()?;
339 let pre = self.pre()?;
340
341 if minor_wildcard {
343 op = Op::Wildcard(WildcardVersion::Minor);
344 }
345
346 if patch_wildcard {
347 op = Op::Wildcard(WildcardVersion::Patch);
348 }
349
350 self.plus_build_metadata()?;
352
353 Ok(Some(Predicate {
354 op: op,
355 major: major,
356 minor: minor,
357 patch: patch,
358 pre: pre,
359 }))
360 }
361
362 pub fn range(&mut self) -> Result<Range, Error<'input>> {
366 let mut predicates = Vec::new();
367
368 if let Some(predicate) = self.predicate()? {
369 predicates.push(predicate);
370
371 while let Some(next) = self.comma_predicate()? {
372 predicates.push(next);
373 }
374 }
375
376 Ok(Range {
377 predicates: predicates,
378 })
379 }
380
381 pub fn version(&mut self) -> Result<Version, Error<'input>> {
385 self.skip_whitespace()?;
386
387 let major = self.numeric()?;
388 let minor = self.dot_numeric()?;
389 let patch = self.dot_numeric()?;
390 let pre = self.pre()?;
391 let build = self.plus_build_metadata()?;
392
393 self.skip_whitespace()?;
394
395 Ok(Version {
396 major: major,
397 minor: minor,
398 patch: patch,
399 pre: pre,
400 build: build,
401 })
402 }
403
404 pub fn is_eof(&mut self) -> bool {
406 self.c1.is_none()
407 }
408
409 #[allow(unused)]
413 pub fn tail(&mut self) -> Result<Vec<Token<'input>>, Error<'input>> {
414 let mut out = Vec::new();
415
416 if let Some(t) = self.c1.take() {
417 out.push(t);
418 }
419
420 while let Some(t) = self.lexer.next() {
421 out.push(t?);
422 }
423
424 Ok(out)
425 }
426}