summary refs log tree commit diff
path: root/src/diff_thread/client.rs
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2021-08-17 19:22:05 +0000
committerAlyssa Ross <hi@alyssa.is>2021-08-17 19:22:05 +0000
commit94a23a6839f3d4632c5abed1cb8846e4d295383e (patch)
treefbebc5db3366f3fdc70238ca08fbd769838fd063 /src/diff_thread/client.rs
parent256ac9c8eb8775acd1f812ee4345e13926181f0e (diff)
downloadgit-girf-94a23a6839f3d4632c5abed1cb8846e4d295383e.tar
git-girf-94a23a6839f3d4632c5abed1cb8846e4d295383e.tar.gz
git-girf-94a23a6839f3d4632c5abed1cb8846e4d295383e.tar.bz2
git-girf-94a23a6839f3d4632c5abed1cb8846e4d295383e.tar.lz
git-girf-94a23a6839f3d4632c5abed1cb8846e4d295383e.tar.xz
git-girf-94a23a6839f3d4632c5abed1cb8846e4d295383e.tar.zst
git-girf-94a23a6839f3d4632c5abed1cb8846e4d295383e.zip
Proof of concept
Diffstat (limited to 'src/diff_thread/client.rs')
-rw-r--r--src/diff_thread/client.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/diff_thread/client.rs b/src/diff_thread/client.rs
new file mode 100644
index 0000000..dcc9cfe
--- /dev/null
+++ b/src/diff_thread/client.rs
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: EUPL-1.2
+// SPDX-FileCopyrightText: 2021 Alyssa Ross <hi@alyssa.is>
+
+use super::{server, FileDiff, MakeDiff};
+
+use std::sync::mpsc::{sync_channel, SyncSender};
+use std::thread::spawn;
+
+use git2::Repository;
+
+pub struct DiffThread<D: MakeDiff> {
+    sender: SyncSender<(D, SyncSender<Result<FileDiff, git2::Error>>)>,
+}
+
+impl<D: MakeDiff> DiffThread<D> {
+    pub fn new(repo: Repository) -> Self {
+        let (sender, receiver) = sync_channel(0);
+
+        spawn(move || server::main(&repo, receiver));
+
+        Self { sender }
+    }
+
+    pub fn diff_files(&self, diff_maker: D) -> impl Iterator<Item = Result<FileDiff, git2::Error>> {
+        let (sender, receiver) = sync_channel(2);
+        self.sender
+            .send((diff_maker, sender))
+            .expect("sending to diff thread");
+        receiver.into_iter()
+    }
+}