interprex_test/
code_hosting.rs1use 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}