version_number/parsers/
original.rs

1//! The _original parser_ module.
2//!
3//! Please refer to to the [`parsers`] module for a more detailed description of
4//! this type of parser.
5//!
6//! [`crate::parsers`]
7
8use crate::parsers::error::ExpectedError;
9use crate::parsers::{BaseVersionParser, FullVersionParser, VersionParser};
10use crate::{BaseVersion, FullVersion, ParserError, Version};
11pub use error::{ErrorReason, NumberError, OriginalParserError};
12pub use parser::Parser;
13
14mod error;
15mod parser;
16
17#[cfg(test)]
18mod tests;
19
20/// A convenience interface to the original parser.
21///
22/// You can also use the parser directly using [`original::Parser`].
23///
24/// [`original::Parser`]: Parser
25#[derive(Debug)]
26pub struct OriginalParser;
27
28impl VersionParser for OriginalParser {
29    fn parse_version<B: AsRef<[u8]>>(&self, input: B) -> Result<Version, ParserError> {
30        let parser = Parser::from_slice(input.as_ref());
31
32        parser.parse().map_err(ParserError::from)
33    }
34}
35
36impl BaseVersionParser for OriginalParser {
37    fn parse_base<B: AsRef<[u8]>>(&self, input: B) -> Result<BaseVersion, ParserError> {
38        let parser = Parser::from_slice(input.as_ref());
39
40        parser
41            .parse()
42            .and_then(|v| match v {
43                Version::Base(b) => Ok(b),
44                Version::Full(f) => Err(OriginalParserError::from_parser(
45                    &parser,
46                    ErrorReason::ExpectedEndOfInput {
47                        extra_input: format!(".{}", f.patch).into_bytes(),
48                    },
49                )),
50            })
51            .map_err(ParserError::from)
52    }
53}
54
55impl FullVersionParser for OriginalParser {
56    fn parse_full<B: AsRef<[u8]>>(&self, input: B) -> Result<FullVersion, ParserError> {
57        let parser = Parser::from_slice(input.as_ref());
58
59        parser.parse().map_err(From::from).and_then(|v| match v {
60            Version::Base(_) => Err(ParserError::Expected(ExpectedError::Separator {
61                at: None,
62                got: None,
63            })),
64            Version::Full(f) => Ok(f),
65        })
66    }
67}