use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(tag = "source_type", rename_all = "lowercase")]
#[non_exhaustive]
pub enum ReleaseSourceConfig {
Github(GithubParams),
Gitlab(GitlabParams),
Bitbucket(BitbucketParams),
Gitea(GiteaParams),
Codeberg(CodebergParams),
Direct(DirectParams),
#[serde(rename = "custom")]
Custom {
#[serde(rename = "type")]
source_type: String,
params: BTreeMap<String, String>,
},
}
impl ReleaseSourceConfig {
#[must_use]
pub fn source_type(&self) -> &str {
match self {
Self::Github(_) => "github",
Self::Gitlab(_) => "gitlab",
Self::Bitbucket(_) => "bitbucket",
Self::Gitea(_) => "gitea",
Self::Codeberg(_) => "codeberg",
Self::Direct(_) => "direct",
Self::Custom { source_type, .. } => source_type,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct GithubParams {
#[serde(default = "GithubParams::default_host")]
pub host: String,
pub owner: String,
pub repo: String,
#[serde(default)]
pub private: bool,
#[serde(default = "GithubParams::default_timeout_seconds")]
pub timeout_seconds: u64,
#[serde(skip)]
pub allow_insecure_base_url: bool,
}
impl GithubParams {
fn default_host() -> String {
"api.github.com".to_string()
}
const fn default_timeout_seconds() -> u64 {
30
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct GitlabParams {
#[serde(default = "GitlabParams::default_host")]
pub host: String,
pub owner: String,
pub repo: String,
#[serde(default)]
pub private: bool,
#[serde(default = "GitlabParams::default_timeout_seconds")]
pub timeout_seconds: u64,
#[serde(skip)]
pub allow_insecure_base_url: bool,
}
impl GitlabParams {
fn default_host() -> String {
"gitlab.com".to_string()
}
const fn default_timeout_seconds() -> u64 {
30
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct BitbucketParams {
#[serde(default = "BitbucketParams::default_host")]
pub host: String,
pub workspace: String,
pub repo_slug: String,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub private: bool,
#[serde(default = "BitbucketParams::default_timeout_seconds")]
pub timeout_seconds: u64,
#[serde(skip)]
pub allow_insecure_base_url: bool,
}
impl BitbucketParams {
fn default_host() -> String {
"api.bitbucket.org/2.0".to_string()
}
const fn default_timeout_seconds() -> u64 {
30
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct GiteaParams {
pub host: String,
pub owner: String,
pub repo: String,
#[serde(default)]
pub private: bool,
#[serde(default = "GiteaParams::default_timeout_seconds")]
pub timeout_seconds: u64,
#[serde(skip)]
pub allow_insecure_base_url: bool,
}
impl GiteaParams {
const fn default_timeout_seconds() -> u64 {
30
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct CodebergParams {
pub owner: String,
pub repo: String,
#[serde(default)]
pub private: bool,
#[serde(default = "CodebergParams::default_timeout_seconds")]
pub timeout_seconds: u64,
#[serde(skip)]
pub allow_insecure_base_url: bool,
}
impl CodebergParams {
pub const HOST: &'static str = "codeberg.org";
const fn default_timeout_seconds() -> u64 {
30
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct DirectParams {
pub version_url: String,
pub asset_url_template: String,
#[serde(default)]
pub pinned_version: Option<String>,
#[serde(default = "DirectParams::default_timeout_seconds")]
pub timeout_seconds: u64,
#[serde(skip)]
pub allow_insecure_base_url: bool,
}
impl DirectParams {
const fn default_timeout_seconds() -> u64 {
30
}
}