Skip to main content

interprex_test/
issues.rs

1use async_trait::async_trait;
2use interprex::{Issue, IssueNumber, IssuesProvider, Label, Repository, Result};
3
4use crate::state::{FakeProvider, missing};
5
6#[async_trait]
7impl IssuesProvider for FakeProvider {
8    async fn issue(&self, repository: &Repository, number: IssueNumber) -> Result<Issue> {
9        self.state
10            .read()
11            .await
12            .issues
13            .get(&(repository.clone(), number))
14            .cloned()
15            .ok_or_else(|| missing(format!("issue {number:?} in {repository}")))
16    }
17
18    async fn labels(&self, repository: &Repository) -> Result<Vec<Label>> {
19        Ok(self
20            .state
21            .read()
22            .await
23            .labels
24            .get(repository)
25            .cloned()
26            .unwrap_or_default())
27    }
28
29    async fn upsert_label(&self, repository: &Repository, label: &Label) -> Result<Label> {
30        let mut state = self.state.write().await;
31        let labels = state.labels.entry(repository.clone()).or_default();
32        if let Some(existing) = labels
33            .iter_mut()
34            .find(|existing| existing.name == label.name)
35        {
36            *existing = label.clone();
37        } else {
38            labels.push(label.clone());
39        }
40        Ok(label.clone())
41    }
42}