gradle_sync/
properties.rs1use 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}