use git_stree::Subtrees;
use std::sync::mpsc::{self, SendError};
use std::sync::mpsc::{Receiver, Sender, TryRecvError};
use std::thread;
use git_stree::SubtreeConfig;
use crate::commit::Oid;
use super::ActorThread;
pub struct SubtreeChangesRequest {
pub oid: Oid,
}
pub struct SubtreeChangesResponse {
pub oid: Oid,
pub subtrees: Vec<SubtreeConfig>,
}
pub struct SubtreeThread(ActorThread<SubtreeChangesRequest, SubtreeChangesResponse>);
impl SubtreeThread {
pub(crate) fn new(subtrees: Subtrees) -> Self {
let (tx_1, receiver): (
Sender<SubtreeChangesResponse>,
Receiver<SubtreeChangesResponse>,
) = mpsc::channel();
let (sender, rx_2): (
Sender<SubtreeChangesRequest>,
Receiver<SubtreeChangesRequest>,
) = mpsc::channel();
let thread = thread::spawn(move || {
while let Ok(v) = rx_2.recv() {
if let Ok(result) = subtrees.changed_modules(&v.oid.to_string()) {
tx_1.send(SubtreeChangesResponse {
oid: v.oid,
subtrees: result,
})
.expect("Send SubtreeChangesResponse");
}
}
});
Self(ActorThread::new(thread, receiver, sender))
}
pub fn send(
&self,
request: SubtreeChangesRequest,
) -> Result<(), SendError<SubtreeChangesRequest>> {
self.0.send(request)
}
pub fn try_recv(&self) -> Result<SubtreeChangesResponse, TryRecvError> {
self.0.try_recv()
}
}