From 1e883be33f61818e941dd2a147ce1bba85d178ce Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Tue, 21 Jul 2020 01:27:37 +0200 Subject: Suggesstion: Implement `patch` to generate a patch for the suggestion Still working on it, but have an initial draft working. There's no file name in the diff hunk, so I'm assuming I'm going to have to add one later. Build a patch from the diff hunk and suggestion comment. 1. Remove `-` lines 2. Change `+` lines to ` ` 3. Change last line to `-` 4. Append suggestion to the diff with a `+` prefix --- src/lib.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 9343b1f..839ad0b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ use github_rs::client::{Executor, Github}; +use regex::Regex; use serde::Deserialize; use serde_json::Value; use thiserror::Error; @@ -63,7 +64,31 @@ pub struct Suggestion { } impl Suggestion { - pub fn patch(&self) { + pub fn patch(&self) -> String { + let mut diff: Vec<_> = self.diff.lines() + .filter(|l| !l.starts_with("-")) + .map(|l| { + if l.starts_with("+") { + return l.replacen("+", " ", 1); + } + + l.to_owned() + }) + .collect(); + + let last = diff.len() - 1; + diff[last] = diff.last().unwrap() + .replacen(" ", "-", 1); + + diff.push(self.suggestion()); + + diff.join("\n") + } + + fn suggestion(&self) -> String { + let re = Regex::new(r"(?s).*```\s*suggestion\n").unwrap(); + let s = re.replace(&self.suggestion, "+"); + s.replace("```", "") } } @@ -83,4 +108,39 @@ mod tests { println!("{:?}", suggestion); } + + #[test] + fn suggestion_patch_generates_patch() { + let suggestion = Suggestion { + diff: r#"@@ -1, 9 +1, 11 @@ + package command + + import ( ++ "bufio" // used to input comment + "errors" + "fmt" + "io" ++ "os" // used to input comment"#.to_owned(), + suggestion: r#"It's ok to leave these uncommented + +```suggestion + "os" +```"#.to_owned(), + }; + + assert_eq!( + suggestion.patch(), + r#"@@ -1, 9 +1, 11 @@ + package command + + import ( + "bufio" // used to input comment + "errors" + "fmt" + "io" +- "os" // used to input comment ++ "os" +"#, + ); + } } -- cgit v1.2.3