use serde::{Deserialize, Serialize}; use crate::{ structs::{self, release::{CreateReleaseOption, Release}}, ApiError, Result }; pub fn get_release(id: u64) -> Result { todo!(); } pub fn get_latest_release() -> Result { todo!(); } pub async fn list_releases( client: &reqwest::Client, gitea_url: &str, repo: &str, ) -> Result> { let request_url = format!("{gitea_url}/api/v1/repos/{repo}/releases/"); let req = client .get(request_url) .send() .await; let response = req .map_err(|reqwest_err| { crate::Error::WrappedReqwestErr(reqwest_err) })?; let release_list = response .json::>() .await .map_err(|reqwest_err| { // Convert reqwest errors to my own // TODO: Create all error variants (see lib.rs) crate::Error::WrappedReqwestErr(reqwest_err) })?; return Ok(release_list); } #[derive(Debug, Deserialize, Serialize)] #[serde(untagged)] enum CreateResult { Success(structs::release::Release), ErrWithMessage(ApiError), Empty, } pub async fn create_release( client: &reqwest::Client, gitea_url: &str, repo: &str, submission: CreateReleaseOption ) -> Result { let request_url = format!("{gitea_url}/api/v1/repos/{repo}/releases"); let req = client .post(request_url) .json(&submission) .send() .await .map_err(|e| crate::Error::from(e))?; let new_release = req .json::() .await .map_err(|e| crate::Error::from(e))?; match new_release { CreateResult::Success(release) => Ok(release), CreateResult::ErrWithMessage(api_error) => { if api_error.message == "token is required" { Err(crate::Error::MissingAuthToken) } else { Err(crate::Error::ApiErrorMessage(api_error)) } }, CreateResult::Empty => panic!("How can we have 200 OK and no release info? No. Crash"), } } pub fn edit_release(id: u64) -> Result { todo!(); } pub fn delete_release(id: u64) -> Result<()> { todo!(); }