diff options
Diffstat (limited to 'src/diff_thread/client.rs')
-rw-r--r-- | src/diff_thread/client.rs | 31 |
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() + } +} |