use async_trait::async_trait;
use super::{
BranchUpdateError, BranchUpdateObservation, ChangeRequest, ChangeRequestHead,
ChangeRequestNumber, CheckOutcome, CheckRun, FindingResolution, FindingResolutionReply,
ProviderTextRecord, ReviewCommentId, ReviewPublicationKey, ReviewRequestTarget,
ReviewRequestTargetInspection, ReviewSubmission, ReviewThreadId, ReviewerApplication,
};
use crate::{Repository, Result};
#[async_trait]
pub trait BranchUpdatesProvider: Send + Sync {
async fn branch_update(
&self,
repository: &Repository,
number: ChangeRequestNumber,
) -> Result<BranchUpdateObservation>;
async fn update_change_request_branch(
&self,
repository: &Repository,
number: ChangeRequestNumber,
expected_head_sha: &str,
) -> std::result::Result<(), BranchUpdateError>;
}
#[async_trait]
pub trait CodeReviewsProvider: Send + Sync {
async fn change_request(
&self,
repository: &Repository,
number: ChangeRequestNumber,
) -> Result<ChangeRequest>;
async fn open_change_requests(
&self,
repository: &Repository,
head: &ChangeRequestHead,
) -> Result<Vec<ChangeRequestNumber>>;
async fn resolve_thread(
&self,
repository: &Repository,
number: ChangeRequestNumber,
thread_id: &ReviewThreadId,
) -> Result<()>;
async fn resolve_finding(
&self,
repository: &Repository,
number: ChangeRequestNumber,
thread_id: &ReviewThreadId,
resolution: FindingResolution,
reply: &FindingResolutionReply,
) -> Result<()>;
async fn request_reviewers(
&self,
repository: &Repository,
number: ChangeRequestNumber,
reviewers: &[ReviewRequestTarget],
) -> Result<()>;
async fn mark_ready(&self, repository: &Repository, number: ChangeRequestNumber) -> Result<()>;
async fn checks(&self, repository: &Repository, head_sha: &str) -> Result<Vec<CheckRun>>;
async fn publish_check(
&self,
repository: &Repository,
app_name: &str,
outcome: &CheckOutcome,
) -> Result<()>;
}
#[async_trait]
pub trait ReviewTargetsProvider: Send + Sync {
async fn inspect_review_request_target(
&self,
repository: &Repository,
target: &ReviewRequestTarget,
) -> Result<ReviewRequestTargetInspection>;
}
pub trait TextRecordsProvider: Send + Sync {
fn embed_record(&self, text: &str, record: &ProviderTextRecord) -> String;
fn extract_records(&self, text: &str) -> Vec<ProviderTextRecord>;
}
#[async_trait]
pub trait ChangeRequestCommentsProvider: Send + Sync {
async fn create_unanchored_comment(
&self,
repository: &Repository,
number: ChangeRequestNumber,
body: &str,
) -> Result<ReviewCommentId>;
}
#[async_trait]
pub trait ReviewerApplicationsProvider: Send + Sync {
async fn resolve_reviewer_application(
&self,
repository: &Repository,
slug: &str,
) -> Result<ReviewerApplication>;
}
#[async_trait]
pub trait ReviewPublishingProvider: Send + Sync {
async fn publish_review(
&self,
repository: &Repository,
number: ChangeRequestNumber,
reviewer: &ReviewerApplication,
submission: &ReviewSubmission,
) -> Result<super::ReviewId>;
async fn resume_review_publication(
&self,
repository: &Repository,
number: ChangeRequestNumber,
reviewer: &ReviewerApplication,
key: &ReviewPublicationKey,
) -> Result<Option<super::ReviewId>>;
}