settings.rs

 1use std::sync::Arc;
 2
 3use git::GitHostingProviderRegistry;
 4use gpui::App;
 5use settings::{
 6    GitHostingProviderConfig, GitHostingProviderKind, RegisterSetting, Settings, SettingsStore,
 7};
 8use url::Url;
 9use util::ResultExt as _;
10
11use crate::{Bitbucket, Forgejo, Gitea, Github, Gitlab, SourceHut};
12
13pub(crate) fn init(cx: &mut App) {
14    init_git_hosting_provider_settings(cx);
15}
16
17fn init_git_hosting_provider_settings(cx: &mut App) {
18    update_git_hosting_providers_from_settings(cx);
19
20    cx.observe_global::<SettingsStore>(update_git_hosting_providers_from_settings)
21        .detach();
22}
23
24fn update_git_hosting_providers_from_settings(cx: &mut App) {
25    let settings_store = cx.global::<SettingsStore>();
26    let settings = GitHostingProviderSettings::get_global(cx);
27    let provider_registry = GitHostingProviderRegistry::global(cx);
28
29    let local_values: Vec<GitHostingProviderConfig> = settings_store
30        .get_all_locals::<GitHostingProviderSettings>()
31        .into_iter()
32        .flat_map(|(_, _, providers)| providers.git_hosting_providers.clone())
33        .collect();
34
35    let iter = settings
36        .git_hosting_providers
37        .clone()
38        .into_iter()
39        .chain(local_values)
40        .filter_map(|provider| {
41            let url = Url::parse(&provider.base_url).log_err()?;
42
43            Some(match provider.provider {
44                GitHostingProviderKind::Bitbucket => {
45                    Arc::new(Bitbucket::new(&provider.name, url)) as _
46                }
47                GitHostingProviderKind::Github => Arc::new(Github::new(&provider.name, url)) as _,
48                GitHostingProviderKind::Gitlab => Arc::new(Gitlab::new(&provider.name, url)) as _,
49                GitHostingProviderKind::Gitea => Arc::new(Gitea::new(&provider.name, url)) as _,
50                GitHostingProviderKind::Forgejo => Arc::new(Forgejo::new(&provider.name, url)) as _,
51                GitHostingProviderKind::SourceHut => {
52                    Arc::new(SourceHut::new(&provider.name, url)) as _
53                }
54            })
55        });
56
57    provider_registry.set_setting_providers(iter);
58}
59
60#[derive(Debug, Clone, RegisterSetting)]
61pub struct GitHostingProviderSettings {
62    pub git_hosting_providers: Vec<GitHostingProviderConfig>,
63}
64
65impl Settings for GitHostingProviderSettings {
66    fn from_settings(content: &settings::SettingsContent) -> Self {
67        Self {
68            git_hosting_providers: content
69                .project
70                .git_hosting_providers
71                .clone()
72                .unwrap()
73                .into(),
74        }
75    }
76}