From f53b5cf97c861ba43d86fa07331e7b11657f11f3 Mon Sep 17 00:00:00 2001 From: Cyborus Date: Mon, 27 Nov 2023 12:56:14 -0500 Subject: [PATCH] add `package` methods --- src/lib.rs | 2 + src/package.rs | 138 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 src/package.rs diff --git a/src/lib.rs b/src/lib.rs index e472a4f..a6a7daf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,7 @@ pub struct Forgejo { mod misc; mod notification; mod organization; +mod package; mod issue; mod repository; mod user; @@ -18,6 +19,7 @@ mod user; pub use misc::*; pub use notification::*; pub use organization::*; +pub use package::*; pub use issue::*; pub use repository::*; pub use user::*; diff --git a/src/package.rs b/src/package.rs new file mode 100644 index 0000000..5788704 --- /dev/null +++ b/src/package.rs @@ -0,0 +1,138 @@ +use std::fmt::Write; + +use super::*; + +impl Forgejo { + pub async fn get_user_packages(&self, owner: &str, query: PackagesQuery) -> Result, ForgejoError> { + self.get(&query.path(owner)).await + } + + pub async fn get_package(&self, owner: &str, _type: PackageType, name: &str, version: &str) -> Result, ForgejoError> { + self.get_opt(&format!("packages/{owner}/{}/{name}/{version}", _type.as_str())).await + } + + pub async fn delete_package(&self, owner: &str, _type: PackageType, name: &str, version: &str) -> Result<(), ForgejoError> { + self.delete(&format!("packages/{owner}/{}/{name}/{version}", _type.as_str())).await + } + + pub async fn get_package_files(&self, owner: &str, _type: PackageType, name: &str, version: &str) -> Result, ForgejoError> { + self.get(&format!("packages/{owner}/{}/{name}/{version}", _type.as_str())).await + } +} + +#[derive(Default, Debug)] +pub struct PackagesQuery { + pub page: Option, + pub limit: Option, + pub kind: Option, + pub query: String, +} + +impl PackagesQuery { + fn path(&self, owner: &str) -> String { + let mut s = String::from("packages/"); + s.push_str(owner); + s.push('?'); + if let Some(page) = self.page { + s.push_str("page="); + s.write_fmt(format_args!("{page}")).expect("writing to string can't fail"); + s.push('&'); + } + if let Some(limit) = self.limit { + s.push_str("limit="); + s.write_fmt(format_args!("{limit}")).expect("writing to string can't fail"); + s.push('&'); + } + if let Some(kind) = self.kind { + s.push_str("type="); + s.push_str(kind.as_str()); + s.push('&'); + } + if !self.query.is_empty() { + s.push_str("q="); + s.push_str(&self.query); + s.push('&'); + } + s + } +} + +#[derive(serde::Deserialize, Debug, PartialEq, Eq, Clone, Copy)] +#[serde(rename_all = "lowercase")] +#[non_exhaustive] +pub enum PackageType { + Alpine, + Cargo, + Chef, + Composer, + Conan, + Conda, + Container, + Cran, + Debian, + Generic, + Go, + Helm, + Maven, + Npm, + Nuget, + Pub, + Pypi, + Rpm, + RubyGems, + Swift, + Vagrant, +} + +impl PackageType { + fn as_str(&self) -> &'static str { + match self { + PackageType::Alpine => "alpine", + PackageType::Cargo => "cargo", + PackageType::Chef => "chef", + PackageType::Composer => "composer", + PackageType::Conan => "conan", + PackageType::Conda => "conda", + PackageType::Container => "container", + PackageType::Cran => "cran", + PackageType::Debian => "debian", + PackageType::Generic => "generic", + PackageType::Go => "go", + PackageType::Helm => "helm", + PackageType::Maven => "maven", + PackageType::Npm => "npm", + PackageType::Nuget => "nuget", + PackageType::Pub => "pub", + PackageType::Pypi => "pypi", + PackageType::Rpm => "rpm", + PackageType::RubyGems => "rubygems", + PackageType::Swift => "swift", + PackageType::Vagrant => "vagrant", + } + } +} + +#[derive(serde::Deserialize, Debug, PartialEq)] +pub struct Package { + #[serde(with = "time::serde::rfc3339")] + pub created_at: time::OffsetDateTime, + pub creator: User, + pub id: u64, + pub name: String, + pub owner: User, + pub repository: Option, + pub _type: PackageType, + pub version: String, +} + +#[derive(serde::Deserialize, Debug, PartialEq)] +pub struct PackageFile { + #[serde(rename = "Size")] + pub size: u64, + pub id: u64, + pub md5: String, + pub name: String, + pub sha1: String, + pub sha256: String, + pub sha512: String, +}