Skip to main content

interprex_test/
code_hosting.rs

1use async_trait::async_trait;
2use interprex::{
3    CodeHostingProvider, Repository, RepositoryFacts, RepositorySettings, Result, Ruleset,
4};
5use secrecy::SecretString;
6
7use crate::state::{FakeProvider, missing};
8
9#[async_trait]
10impl CodeHostingProvider for FakeProvider {
11    async fn repository(&self, repository: &Repository) -> Result<RepositoryFacts> {
12        self.state
13            .read()
14            .await
15            .repositories
16            .get(repository)
17            .map(|(facts, _)| facts.clone())
18            .ok_or_else(|| missing(repository.to_string()))
19    }
20
21    async fn settings(&self, repository: &Repository) -> Result<RepositorySettings> {
22        self.state
23            .read()
24            .await
25            .repositories
26            .get(repository)
27            .map(|(_, settings)| settings.clone())
28            .ok_or_else(|| missing(repository.to_string()))
29    }
30
31    async fn apply_settings(
32        &self,
33        repository: &Repository,
34        settings: &RepositorySettings,
35    ) -> Result<RepositorySettings> {
36        let mut state = self.state.write().await;
37        let (_, current) = state
38            .repositories
39            .get_mut(repository)
40            .ok_or_else(|| missing(repository.to_string()))?;
41        *current = settings.clone();
42        Ok(settings.clone())
43    }
44
45    async fn rulesets(&self, repository: &Repository) -> Result<Vec<Ruleset>> {
46        Ok(self
47            .state
48            .read()
49            .await
50            .rulesets
51            .get(repository)
52            .cloned()
53            .unwrap_or_default())
54    }
55
56    async fn upsert_ruleset(&self, repository: &Repository, ruleset: &Ruleset) -> Result<Ruleset> {
57        let mut state = self.state.write().await;
58        let rulesets = state.rulesets.entry(repository.clone()).or_default();
59        if let Some(existing) = rulesets.iter_mut().find(|existing| {
60            ruleset.id.is_some() && existing.id == ruleset.id || existing.name == ruleset.name
61        }) {
62            *existing = ruleset.clone();
63        } else {
64            rulesets.push(ruleset.clone());
65        }
66        Ok(ruleset.clone())
67    }
68
69    async fn put_secret(
70        &self,
71        repository: &Repository,
72        name: &str,
73        _value: SecretString,
74    ) -> Result<()> {
75        self.state
76            .write()
77            .await
78            .secret_names
79            .entry(repository.clone())
80            .or_default()
81            .push(name.to_owned());
82        Ok(())
83    }
84}