Skip to main content

rtb_vcs/
codeberg.rs

1//! Codeberg backend — a distinct `source_type: codeberg` registration
2//! whose factory delegates to the Gitea backend with `host` pinned to
3//! `codeberg.org`.
4//!
5//! Tool authors who need to point at a different Gitea instance use
6//! [`crate::gitea`] directly. The separate `source_type` exists because
7//! Codeberg is an established GitHub alternative in its own right —
8//! users searching tool configs for "codeberg" should find it.
9//!
10//! # Lint exception
11//!
12//! Same as the other REST backends.
13
14#![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
28/// Factory for the `codeberg` source type. Constructs a Gitea
29/// provider with `host = "codeberg.org"`.
30pub 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}