Skip to main content

pleiades_agent_git/
review.rs

1use std::path::PathBuf;
2use std::sync::Arc;
3
4use pleiades_agent_core::error::Error;
5use pleiades_agent_core::provider::Provider;
6use pleiades_agent_prompts::BuiltinPrompts;
7
8use crate::common::{generate_from_diff, git_diff};
9
10/// Generate structured code reviews from repository diffs.
11pub struct ReviewGenerator {
12    provider: Arc<dyn Provider>,
13    model: String,
14    repository: PathBuf,
15    staged: bool,
16}
17
18impl ReviewGenerator {
19    pub fn new(provider: Arc<dyn Provider>, model: impl Into<String>) -> Self {
20        Self {
21            provider,
22            model: model.into(),
23            repository: PathBuf::from("."),
24            staged: false,
25        }
26    }
27
28    pub fn with_repository(mut self, repository: impl Into<PathBuf>) -> Self {
29        self.repository = repository.into();
30        self
31    }
32
33    pub fn staged(mut self, staged: bool) -> Self {
34        self.staged = staged;
35        self
36    }
37
38    pub async fn generate(&self) -> Result<String, Error> {
39        let arguments: &[&str] = if self.staged {
40            &["diff", "--staged", "--no-ext-diff"]
41        } else {
42            &["diff", "--no-ext-diff"]
43        };
44        let diff = git_diff(&self.repository, arguments).await?;
45        generate_from_diff(
46            self.provider.as_ref(),
47            &self.model,
48            BuiltinPrompts::code_reviewer(),
49            &diff,
50            None,
51        )
52        .await
53    }
54}