aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs62
1 files changed, 61 insertions, 1 deletions
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"
+"#,
+ );
+ }
}