torii_lib/platforms/
release.rs1use super::azure::AzureReleaseClient;
19use super::bitbucket::BitbucketReleaseClient;
20use super::gitea::GiteaReleaseClient;
21use super::github::GitHubReleaseClient;
22use super::gitlab::GitLabReleaseClient;
23use super::radicle::RadicleReleaseClient;
24use super::sourcehut::SourcehutReleaseClient;
25use crate::error::{Result, ToriiError};
26use serde::{Deserialize, Serialize};
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct Release {
30 pub tag: String,
35 pub name: String,
36 pub description: String,
37 pub created_at: String,
38 pub web_url: String,
39 pub id: Option<String>,
41}
42
43#[allow(dead_code)]
44pub trait ReleaseClient: Send {
45 fn list(&self, owner: &str, repo: &str, limit: usize) -> Result<Vec<Release>>;
46 fn get(&self, owner: &str, repo: &str, tag: &str) -> Result<Release>;
47 fn edit(
50 &self,
51 owner: &str,
52 repo: &str,
53 tag: &str,
54 name: Option<&str>,
55 description: Option<&str>,
56 ) -> Result<()>;
57 fn delete(&self, owner: &str, repo: &str, tag: &str) -> Result<()>;
62}
63
64pub fn get_release_client(platform: &str) -> Result<Box<dyn ReleaseClient>> {
69 match platform.to_lowercase().as_str() {
70 "github" => Ok(Box::new(GitHubReleaseClient::new()?)),
71 "gitlab" => Ok(Box::new(GitLabReleaseClient::new()?)),
72 "gitea" => Ok(Box::new(GiteaReleaseClient::new()?)),
73 "sourcehut" => Ok(Box::new(SourcehutReleaseClient::new()?)),
74 "radicle" => Ok(Box::new(RadicleReleaseClient::new()?)),
75 "bitbucket" => Ok(Box::new(BitbucketReleaseClient::new()?)),
76 "azure" => Ok(Box::new(AzureReleaseClient::new()?)),
77 other => Err(ToriiError::Unsupported(format!("Unsupported platform: {}. Supported: github, gitlab, gitea, sourcehut, radicle, bitbucket, azure", other))),
78 }
79}
80
81#[cfg(test)]
82mod tests {
83 use crate::platforms::github::release::parse_github_release;
84 use crate::platforms::gitlab::release::parse_gitlab_release;
85
86 #[test]
87 fn parse_github_release_basic() {
88 let json = serde_json::json!({
89 "id": 12345u64,
90 "tag_name": "v0.7.9",
91 "name": "Gitorii v0.7.9",
92 "body": "Release notes here",
93 "created_at": "2026-05-19T22:00:00Z",
94 "html_url": "https://github.com/paskidev/gitorii/releases/tag/v0.7.9"
95 });
96 let r = parse_github_release(&json).unwrap();
97 assert_eq!(r.tag, "v0.7.9");
98 assert_eq!(r.name, "Gitorii v0.7.9");
99 assert_eq!(r.id.as_deref(), Some("12345"));
100 }
101
102 #[test]
103 fn parse_gitlab_release_basic() {
104 let json = serde_json::json!({
105 "tag_name": "v0.7.9",
106 "name": "Gitorii v0.7.9",
107 "description": "Release notes",
108 "created_at": "2026-05-19T22:00:00Z",
109 "_links": { "self": "https://gitlab.com/paskidev/gitorii/-/releases/v0.7.9" }
110 });
111 let r = parse_gitlab_release(&json).unwrap();
112 assert_eq!(r.tag, "v0.7.9");
113 assert_eq!(r.id, None);
114 assert_eq!(
115 r.web_url,
116 "https://gitlab.com/paskidev/gitorii/-/releases/v0.7.9"
117 );
118 }
119}