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}