version_number/parsers/
original.rs1use 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#[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}