diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-08-01 17:53:56 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-08-01 17:53:56 +0200 |
commit | 2b64f202760ce6137aed368401fafe5b01e50741 (patch) | |
tree | 068d97c234ad9b60073a514344f38310313195b4 /src | |
parent | 8a150b949e64629a1b987da0f44f77015287b3e0 (diff) |
Refactor: Move locking to helper fn for less boilerplate
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/model/backend/worker.rs | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/src/model/backend/worker.rs b/src/model/backend/worker.rs index 4ae4686..4b0857c 100644 --- a/src/model/backend/worker.rs +++ b/src/model/backend/worker.rs @@ -44,43 +44,35 @@ impl BackendWorker { } } - fn send_branch_list(&self, sender: BackendResponseSender) -> std::result::Result<(), BackendError> { - let repo_lock = self.repo - .lock() - .map_err(|_| BackendError::LockError)?; - - let branch_names = get_branch_names(&self.repo_name, &*repo_lock) - .map_err(|e| BackendError::Str(e.to_string()))?; + fn exec_on_repo<R, F>(&self, f: F) -> std::result::Result<R, BackendError> + where R: Sized, + F: FnOnce(&git2::Repository) -> std::result::Result<R, BackendError>, + { + self.repo.lock().map_err(|_| BackendError::LockError).and_then(|repo| f(&repo)) + } - drop(repo_lock); + fn send_branch_list(&self, sender: BackendResponseSender) -> std::result::Result<(), BackendError> { + let branch_names = self.exec_on_repo(|repo| { + get_branch_names(&self.repo_name, repo).map_err(|e| BackendError::Str(e.to_string())) + })?; sender.send(BackendResponse::BranchList(branch_names.value)) .map_err(|_| BackendError::ChannelError) } fn send_tag_list(&self, sender: BackendResponseSender) -> std::result::Result<(), BackendError> { - let repo_lock = self.repo - .lock() - .map_err(|_| BackendError::LockError)?; - - let tag_names = get_tag_names(&self.repo_name, &*repo_lock) - .map_err(|e| BackendError::Str(e.to_string()))?; - - drop(repo_lock); + let tag_names = self.exec_on_repo(|repo| { + get_tag_names(&self.repo_name, repo).map_err(|e| BackendError::Str(e.to_string())) + })?; sender.send(BackendResponse::TagList(tag_names.value)) .map_err(|_| BackendError::ChannelError) } fn find_branch_id(&self, name: String, sender: BackendResponseSender) -> std::result::Result<(), BackendError> { - let repo_lock = self.repo - .lock() - .map_err(|_| BackendError::LockError)?; - - let branch = repo_lock.find_branch(&name, git2::BranchType::Local) - .map_err(|_| BackendError::FindBranchError(name))?; - - drop(repo_lock); + let branch = self.exec_on_repo(|repo| { + repo.find_branch(&name, git2::BranchType::Local).map_err(|_| BackendError::FindBranchError(name)) + })?; let branch_id = branch.get() .peel_to_commit() @@ -92,14 +84,9 @@ impl BackendWorker { } fn find_tree_for_id(&self, id: git2::Oid, sender: BackendResponseSender) -> std::result::Result<(), BackendError> { - let repo_lock = self.repo - .lock() - .map_err(|_| BackendError::LockError)?; - - let tree = repo_lock.find_tree(id) - .map_err(|_| BackendError::FindTreeForIdError(id))?; - - drop(repo_lock); + let tree = self.exec_on_repo(|repo| { + repo.find_tree(id).map_err(|_| BackendError::FindTreeForIdError(id)) + })?; sender.send(BackendResponse::TreeId(tree.id())) .map_err(|_| BackendError::ChannelError) |