gradle_sync/
properties.rs

1use semver::Version;
2use regex::Regex;
3use configfile::ConfigurationFormat;
4use std::io::Read;
5use std::io::{BufRead, BufReader};
6use error::GradleResult;
7use error::Error;
8use version::GradleVersion;
9
10pub struct PropertiesContent {
11    lines: Vec<String>,
12    version: GradleVersion,
13    modified: bool
14}
15
16impl ConfigurationFormat for PropertiesContent {
17    fn from<R: Read>(reader: R) -> GradleResult<Self>{
18        let mut project_version: Option<Version> = None;
19
20        let f = BufReader::new(reader);
21        let mut lines: Vec<String> = vec!();
22        for result_line in f.lines() {
23            let line = result_line?;
24            if project_version.is_none() {
25                project_version = parse_project_version_from_line(&line);
26            }
27            lines.push(line);
28        }
29        if project_version.is_none() {
30            return Err(Error::VersionNotFound("failed to find projectVersion".to_string()))
31        }
32        Ok(Self{
33            lines,
34            version: GradleVersion::new(1, project_version.unwrap()),
35            modified: false
36        })
37    }
38    fn current_version(&self) -> GradleResult<&GradleVersion> {
39        Ok(&self.version)
40    }
41    fn is_modified(&self) -> bool {
42        self.modified
43    }
44    fn sync_version(&mut self, new_version: &Version) -> GradleResult<()> {
45        if self.version.synchronize_version(new_version)? {
46            self.modified = true
47        }
48        Ok(())
49    }
50    fn lines(&self) -> Vec<String> {
51        self.lines.iter().map(|line|{
52            replace_project_version_from_line(line.clone(), self.version.version())
53        }).collect()
54    }
55}
56
57pub fn parse_project_version_from_line(line: &str) -> Option<Version> {
58    let re = Regex::new(r"projectVersion\s*=\s*(?P<version>[\d.]+)").unwrap();
59    let caps = re.captures(line);
60    match caps {
61        Some(caps) => {
62            let version = Version::parse(&caps["version"]);
63            match version {
64                Ok(version) => Some(version),
65                Err(_err) => None
66            }
67        },
68        None => None
69    }
70}
71
72pub fn replace_project_version_from_line(line: String, new_version: &Version) -> String {
73    let version_found = parse_project_version_from_line(&line);
74    match version_found {
75        Some(old_version) => {
76            line.replace(&old_version.to_string(), &new_version.to_string())
77        },
78        None => line
79    }
80}