summary refs log tree commit diff
path: root/src/diff_thread/client.rs
blob: dcc9cfe6eafcf7090cebe909382a9f6b89b91b26 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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()
    }
}