pub mod github;
pub mod models;
pub use github::GitHubForge;
pub use models::{
ForgeCommentUpdate, ForgeDraftCommentInput, ForgeDraftCommentReceipt, ForgePullRequest,
ForgePullRequestBundle, ForgeReviewComment, ForgeReviewReceipt, ForgeReviewSession,
};
use crate::backend::{
error::Result, extensions::gitoxide::HeadCommitPayload, models::ReviewOutcome,
};
#[async_trait::async_trait]
pub trait RemoteForge: Send + Sync {
async fn push_branch(
&self,
_repository_url: &str,
_branch: &str,
_payload: &HeadCommitPayload,
) -> Result<Option<String>> {
Ok(None)
}
async fn get_pull_request_bundle(
&self,
repository_url: &str,
branch_or_pr: &str,
) -> Result<ForgePullRequestBundle>;
async fn create_pending_review(
&self,
repository_url: &str,
pr_number: u64,
head_sha: &str,
) -> Result<String>;
async fn create_remote_draft_comment(
&self,
repository_url: &str,
pr_number: u64,
pending_review_id: Option<&str>,
comment: &ForgeDraftCommentInput,
) -> Result<ForgeDraftCommentReceipt>;
async fn update_remote_comment(
&self,
repository_url: &str,
forge_id: &str,
update: &ForgeCommentUpdate,
) -> Result<()>;
async fn delete_remote_comment(&self, repository_url: &str, forge_id: &str) -> Result<()>;
async fn set_remote_file_viewed(
&self,
repository_url: &str,
pr_forge_id: Option<&str>,
pr_number: u64,
file_path: &str,
viewed: bool,
) -> Result<()>;
async fn submit_pending_review(
&self,
repository_url: &str,
pr_number: u64,
pending_review_id: Option<&str>,
outcome: ReviewOutcome,
body: Option<&str>,
) -> Result<ForgeReviewReceipt>;
}