use anyhow::{anyhow, Result}; use serde::{Deserialize, Serialize}; #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Author { pub id: i64, pub login: String, pub full_name: String, pub email: String, pub avatar_url: String, pub language: String, pub is_admin: bool, pub last_login: String, pub created: String, pub username: String, } #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Release { pub id: i64, pub tag_name: String, pub target_commitish: String, pub name: String, pub body: String, pub url: String, pub tarball_url: String, pub zipball_url: String, pub draft: bool, pub prerelease: bool, pub created_at: String, pub published_at: String, pub author: Author, pub assets: Vec, } use cli_table::{Cell, Row}; impl Release { pub fn row(&self) -> Row { Row::new(vec![ Cell::new(&format!("{}", self.id), Default::default()), Cell::new(&self.tag_name, Default::default()), Cell::new(&self.created_at, Default::default()), Cell::new(&self.target_commitish, Default::default()), Cell::new(&self.author.username, Default::default()), Cell::new(&self.name, Default::default()), ]) } } #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct CreateRelease { pub body: String, pub draft: bool, pub name: String, pub prerelease: bool, pub tag_name: String, pub target_commitish: String, } pub(crate) async fn get_release_by_tag( cli: &reqwest::Client, server: &String, owner: &String, repo: &String, tag: &String, ) -> Result { let releases: Vec = cli .get(&format!( "{}/api/v1/repos/{}/{}/releases", server, owner, repo )) .send() .await? .json() .await?; let mut release: Option = None; for rls in releases { if *tag == rls.tag_name { release = Some(rls); } } if release.is_none() { return Err(anyhow!("tag {} not found", tag)); } Ok(release.unwrap()) } #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Attachment { pub id: i64, pub name: String, pub size: i64, pub download_count: i64, pub created_at: String, pub uuid: String, pub browser_download_url: String, } impl Attachment { pub fn row(&self) -> Row { let size = { let bytes = byte_unit::Byte::from_bytes(self.size as u128); let unit = bytes.get_appropriate_unit(false); unit.to_string() }; Row::new(vec![ Cell::new(&self.name, Default::default()), Cell::new(&size, Default::default()), Cell::new(&self.browser_download_url, Default::default()), ]) } } pub(crate) async fn get_attachments_for_release( cli: &reqwest::Client, server: &String, owner: &String, repo: &String, id: &i64, ) -> Result> { let attachments: Vec = cli .get(&format!( "{}/api/v1/repos/{}/{}/releases/{}/assets", server, owner, repo, id )) .send() .await? .json() .await?; Ok(attachments) }