1#![allow(unsafe_code)]
15
16use std::sync::Arc;
17
18use linkme::distributed_slice;
19use secrecy::SecretString;
20
21use crate::config::{CodebergParams, GiteaParams, ReleaseSourceConfig};
22use crate::gitea;
23use crate::release::{
24 ProviderError, ProviderFactory, ProviderRegistration, RegisteredProvider, ReleaseProvider,
25 RELEASE_PROVIDERS,
26};
27
28pub fn factory(
31 cfg: &ReleaseSourceConfig,
32 token: Option<SecretString>,
33) -> Result<Arc<dyn ReleaseProvider>, ProviderError> {
34 let ReleaseSourceConfig::Codeberg(params) = cfg else {
35 return Err(ProviderError::InvalidConfig(format!(
36 "codeberg factory called with non-codeberg config: source_type={}",
37 cfg.source_type()
38 )));
39 };
40 let gitea_params = to_gitea_params(params);
41 gitea::build_provider(&gitea_params, token)
42}
43
44fn to_gitea_params(p: &CodebergParams) -> GiteaParams {
45 GiteaParams {
46 host: CodebergParams::HOST.to_string(),
47 owner: p.owner.clone(),
48 repo: p.repo.clone(),
49 private: p.private,
50 timeout_seconds: p.timeout_seconds,
51 allow_insecure_base_url: p.allow_insecure_base_url,
52 }
53}
54
55#[distributed_slice(RELEASE_PROVIDERS)]
56fn __register_codeberg() -> Box<dyn ProviderRegistration> {
57 Box::new(RegisteredProvider { source_type: "codeberg", factory: factory as ProviderFactory })
58}