diff --git a/crates/tabby-common/src/api/event.rs b/crates/tabby-common/src/api/event.rs index 70fd5e6..e333461 100644 --- a/crates/tabby-common/src/api/event.rs +++ b/crates/tabby-common/src/api/event.rs @@ -47,10 +47,12 @@ pub enum Event<'a> { user: Option<&'a str>, }, } + #[derive(Serialize)] pub struct Segments { pub prefix: String, pub suffix: Option, + pub clipboard: Option, } pub trait EventLogger: Send + Sync { diff --git a/crates/tabby/src/services/completion.rs b/crates/tabby/src/services/completion.rs index 153d744..ecdc2df 100644 --- a/crates/tabby/src/services/completion.rs +++ b/crates/tabby/src/services/completion.rs @@ -101,6 +101,9 @@ pub struct Segments { /// Content that appears after the cursor in the editor window. suffix: Option, + + /// Clipboard content when requesting code completion. + clipboard: Option, } impl From for api::event::Segments { @@ -108,6 +111,7 @@ impl From for api::event::Segments { Self { prefix: val.prefix, suffix: val.suffix, + clipboard: val.clipboard, } } } diff --git a/crates/tabby/src/services/completion/completion_prompt.rs b/crates/tabby/src/services/completion/completion_prompt.rs index 742e5bf..f00695d 100644 --- a/crates/tabby/src/services/completion/completion_prompt.rs +++ b/crates/tabby/src/services/completion/completion_prompt.rs @@ -192,6 +192,14 @@ mod tests { PromptBuilder::new(prompt_template, None) } + fn make_segment(prefix: String, suffix: Option) -> Segments { + Segments { + prefix, + suffix, + clipboard: None, + } + } + #[test] fn test_prompt_template() { let pb = create_prompt_builder(true); @@ -202,10 +210,10 @@ mod tests { // Test w/ prefix, w/ suffix. { - let segments = Segments { - prefix: "this is some prefix".into(), - suffix: Some("this is some suffix".into()), - }; + let segments = make_segment( + "this is some prefix".into(), + Some("this is some suffix".into()), + ); assert_eq!( pb.build(language, segments, snippets), "
 this is some prefix this is some suffix "
@@ -214,10 +222,7 @@ mod tests {
 
         // Test w/ prefix, w/o suffix.
         {
-            let segments = Segments {
-                prefix: "this is some prefix".into(),
-                suffix: None,
-            };
+            let segments = make_segment("this is some prefix".into(), None);
             assert_eq!(
                 pb.build(language, segments, snippets),
                 "
 this is some prefix \n "
@@ -226,10 +231,7 @@ mod tests {
 
         // Test w/ prefix, w/ empty suffix.
         {
-            let segments = Segments {
-                prefix: "this is some prefix".into(),
-                suffix: Some("".into()),
-            };
+            let segments = make_segment("this is some prefix".into(), Some("".into()));
             assert_eq!(
                 pb.build(language, segments, snippets),
                 "
 this is some prefix \n "
@@ -238,10 +240,7 @@ mod tests {
 
         // Test w/ empty prefix, w/ suffix.
         {
-            let segments = Segments {
-                prefix: "".into(),
-                suffix: Some("this is some suffix".into()),
-            };
+            let segments = make_segment("".into(), Some("this is some suffix".into()));
             assert_eq!(
                 pb.build(language, segments, snippets),
                 "
  this is some suffix "
@@ -250,10 +249,7 @@ mod tests {
 
         // Test w/ empty prefix, w/o suffix.
         {
-            let segments = Segments {
-                prefix: "".into(),
-                suffix: None,
-            };
+            let segments = make_segment("".into(), None);
             assert_eq!(
                 pb.build(language, segments, snippets),
                 "
  \n "
@@ -262,10 +258,7 @@ mod tests {
 
         // Test w/ emtpy prefix, w/ empty suffix.
         {
-            let segments = Segments {
-                prefix: "".into(),
-                suffix: Some("".into()),
-            };
+            let segments = make_segment("".into(), Some("".into()));
             assert_eq!(
                 pb.build(language, segments, snippets),
                 "
  \n "
@@ -283,10 +276,10 @@ mod tests {
 
         // Test w/ prefix, w/ suffix.
         {
-            let segments = Segments {
-                prefix: "this is some prefix".into(),
-                suffix: Some("this is some suffix".into()),
-            };
+            let segments = make_segment(
+                "this is some prefix".into(),
+                Some("this is some suffix".into()),
+            );
             assert_eq!(
                 pb.build(language, segments, snippets),
                 "this is some prefix"
@@ -295,10 +288,7 @@ mod tests {
 
         // Test w/ prefix, w/o suffix.
         {
-            let segments = Segments {
-                prefix: "this is some prefix".into(),
-                suffix: None,
-            };
+            let segments = make_segment("this is some prefix".into(), None);
             assert_eq!(
                 pb.build(language, segments, snippets),
                 "this is some prefix"
@@ -307,10 +297,7 @@ mod tests {
 
         // Test w/ prefix, w/ empty suffix.
         {
-            let segments = Segments {
-                prefix: "this is some prefix".into(),
-                suffix: Some("".into()),
-            };
+            let segments = make_segment("this is some prefix".into(), Some("".into()));
             assert_eq!(
                 pb.build(language, segments, snippets),
                 "this is some prefix"
@@ -319,28 +306,19 @@ mod tests {
 
         // Test w/ empty prefix, w/ suffix.
         {
-            let segments = Segments {
-                prefix: "".into(),
-                suffix: Some("this is some suffix".into()),
-            };
+            let segments = make_segment("".into(), Some("this is some suffix".into()));
             assert_eq!(pb.build(language, segments, snippets), "");
         }
 
         // Test w/ empty prefix, w/o suffix.
         {
-            let segments = Segments {
-                prefix: "".into(),
-                suffix: None,
-            };
+            let segments = make_segment("".into(), None);
             assert_eq!(pb.build(language, segments, snippets), "");
         }
 
         // Test w/ empty prefix, w/ empty suffix.
         {
-            let segments = Segments {
-                prefix: "".into(),
-                suffix: Some("".into()),
-            };
+            let segments = make_segment("".into(), Some("".into()));
             assert_eq!(pb.build(language, segments, snippets), "");
         }
     }