reproto_core/
rp_required_package.rs

1//! A package requirement
2
3use errors::Result;
4use std::fmt;
5use {Range, RpPackage};
6
7#[derive(Debug, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
8pub struct RpRequiredPackage {
9    pub package: RpPackage,
10    pub range: Range,
11}
12
13impl RpRequiredPackage {
14    pub fn new(package: RpPackage, range: Range) -> RpRequiredPackage {
15        RpRequiredPackage {
16            package: package,
17            range: range,
18        }
19    }
20
21    /// Parse the package requirement from a string.
22    pub fn parse(input: &str) -> Result<RpRequiredPackage> {
23        let mut it = input.splitn(2, '@').into_iter();
24
25        let package = it.next()
26            .map(RpPackage::parse)
27            .unwrap_or_else(RpPackage::empty);
28
29        let range = if let Some(version) = it.next() {
30            Range::parse(version).map_err(|e| format!("bad version: {}: {}", e, version))?
31        } else {
32            Range::any()
33        };
34
35        Ok(RpRequiredPackage::new(package, range))
36    }
37}
38
39impl fmt::Display for RpRequiredPackage {
40    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
41        if self.range.matches_any() {
42            write!(f, "{}", self.package)
43        } else {
44            write!(f, "{} {}", self.package, self.range)
45        }
46    }
47}