diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 41 | 
1 files changed, 41 insertions, 0 deletions
@@ -1,11 +1,17 @@  #![warn(rust_2018_idioms)] +use std::fs; +use std::fs::File; +use std::io::{BufRead, BufReader, Write}; + +use git2::Repository;  use github_rs::client::{Executor, Github};  use regex::Regex;  use serde::Deserialize;  use serde_json::Value;  use thiserror::Error; +use tempfile::tempfile;  #[derive(Debug, Error)] @@ -61,6 +67,11 @@ pub struct Suggestion {      #[serde(rename = "body")]      suggestion: String, + +    path: String, + +    original_start_line: usize, +    original_end_line: usize,  }  impl Suggestion { @@ -90,6 +101,36 @@ impl Suggestion {          let s = re.replace(&self.suggestion, "+");          s.replace("```", "")      } + +    fn apply(&self) -> Result<(), Error> { +        let repo = Repository::open(".").unwrap(); +        let repo_root = repo.workdir().unwrap(); + +        let original = File::open(repo_root.join(&self.path)).unwrap(); +        let metadata = original.metadata().unwrap(); +        let created_at = metadata.created().unwrap(); +        let mut reader = BufReader::new(original); + +        let mut new = tempfile().unwrap(); + +        for (i, line) in reader.lines().enumerate() { +            match line { +                Ok(l) => { +                    if i < self.original_start_line +                            || i > self.original_end_line { +                        writeln!(new, "{}", l).unwrap(); +                    } else if i == self.original_end_line { +                        write!(new, "{}", self.suggestion()).unwrap(); +                    } +                }, +                Err(e) => panic!(e), +            } +        } + +        fs::rename(new, original).unwrap(); + +        Ok(()) +    }  }  #[cfg(test)]  | 
