reproto_core/
rp_required_package.rs1use 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 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}