summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCyborus <cyborus@cyborus.xyz>2023-11-19 20:08:45 +0100
committerCyborus <cyborus@cyborus.xyz>2023-11-19 20:08:45 +0100
commited4984d54ac073981a8efb5c66a8b744cad98199 (patch)
treed9bb8b767da7957dfdcd2dcee9ccb473a0bca6b3 /src
parentMerge pull request 'actually it should be `Option`al' (#13) from fix-issue-pr... (diff)
downloadforgejo-api-ed4984d54ac073981a8efb5c66a8b744cad98199.tar.xz
forgejo-api-ed4984d54ac073981a8efb5c66a8b744cad98199.zip
fill in `Repository` struct fields
Diffstat (limited to 'src')
-rw-r--r--src/issue.rs50
-rw-r--r--src/lib.rs53
-rw-r--r--src/organization.rs30
-rw-r--r--src/repository.rs101
4 files changed, 180 insertions, 54 deletions
diff --git a/src/issue.rs b/src/issue.rs
index 25126b1..6712e69 100644
--- a/src/issue.rs
+++ b/src/issue.rs
@@ -200,61 +200,13 @@ pub struct Comment {
pub issue_url: Url,
pub original_author: String,
pub original_author_id: u64,
- #[serde(deserialize_with = "none_if_blank_url")]
+ #[serde(deserialize_with = "crate::none_if_blank_url")]
pub pull_request_url: Option<Url>,
#[serde(with = "time::serde::rfc3339")]
pub updated_at: time::OffsetDateTime,
pub user: User,
}
-fn none_if_blank_url<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result<Option<Url>, D::Error> {
- use serde::de::{Error, Unexpected, Visitor};
- use std::fmt;
-
- struct EmptyUrlVisitor;
-
- impl<'de> Visitor<'de> for EmptyUrlVisitor
- {
- type Value = Option<Url>;
-
- fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- formatter.write_str("option")
- }
-
- #[inline]
- fn visit_unit<E>(self) -> Result<Self::Value, E>
- where
- E: Error,
- {
- Ok(None)
- }
-
- #[inline]
- fn visit_none<E>(self) -> Result<Self::Value, E>
- where
- E: Error,
- {
- Ok(None)
- }
-
- #[inline]
- fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
- where
- E: Error,
- {
- if s.is_empty() {
- return Ok(None);
- }
- Url::parse(s).map_err(|err| {
- let err_s = format!("{}", err);
- Error::invalid_value(Unexpected::Str(s), &err_s.as_str())
- }).map(Some)
- }
- }
-
- deserializer.deserialize_str(EmptyUrlVisitor)
-}
-
#[derive(Default, Debug)]
pub struct IssueQuery {
pub state: Option<State>,
diff --git a/src/lib.rs b/src/lib.rs
index 0bef4c0..df34694 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -8,10 +8,12 @@ pub struct Forgejo {
client: Client,
}
+mod organization;
mod issue;
mod repository;
mod user;
+pub use organization::*;
pub use issue::*;
pub use repository::*;
pub use user::*;
@@ -156,3 +158,54 @@ struct ErrorMessage {
// intentionally ignored, no need for now
// url: Url
}
+
+// Forgejo can return blank strings for URLs. This handles that by deserializing
+// that as `None`
+fn none_if_blank_url<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result<Option<Url>, D::Error> {
+ use serde::de::{Error, Unexpected, Visitor};
+ use std::fmt;
+
+ struct EmptyUrlVisitor;
+
+ impl<'de> Visitor<'de> for EmptyUrlVisitor
+ {
+ type Value = Option<Url>;
+
+ fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ formatter.write_str("option")
+ }
+
+ #[inline]
+ fn visit_unit<E>(self) -> Result<Self::Value, E>
+ where
+ E: Error,
+ {
+ Ok(None)
+ }
+
+ #[inline]
+ fn visit_none<E>(self) -> Result<Self::Value, E>
+ where
+ E: Error,
+ {
+ Ok(None)
+ }
+
+ #[inline]
+ fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
+ where
+ E: Error,
+ {
+ if s.is_empty() {
+ return Ok(None);
+ }
+ Url::parse(s).map_err(|err| {
+ let err_s = format!("{}", err);
+ Error::invalid_value(Unexpected::Str(s), &err_s.as_str())
+ }).map(Some)
+ }
+ }
+
+ deserializer.deserialize_str(EmptyUrlVisitor)
+}
+
diff --git a/src/organization.rs b/src/organization.rs
new file mode 100644
index 0000000..55cbd45
--- /dev/null
+++ b/src/organization.rs
@@ -0,0 +1,30 @@
+use std::collections::BTreeMap;
+use crate::*;
+
+#[derive(serde::Deserialize, Debug, PartialEq)]
+pub struct Organization {
+ #[serde(deserialize_with = "crate::none_if_blank_url")]
+ pub avatar_url: Option<Url>,
+ pub description: String,
+ pub full_name: String,
+ pub id: u64,
+ pub location: Option<String>,
+ pub name: String,
+ pub repo_admin_change_team_access: bool,
+ pub visibility: String,
+ #[serde(deserialize_with = "crate::none_if_blank_url")]
+ pub website: Option<Url>,
+}
+
+#[derive(serde::Deserialize, Debug, PartialEq)]
+pub struct Team {
+ pub can_create_org_repo: bool,
+ pub description: String,
+ pub id: u64,
+ pub includes_all_repositories: bool,
+ pub name: String,
+ pub organization: Organization,
+ pub permission: String,
+ pub units: Vec<String>,
+ pub units_map: BTreeMap<String, String>,
+}
diff --git a/src/repository.rs b/src/repository.rs
index c88efff..af302a8 100644
--- a/src/repository.rs
+++ b/src/repository.rs
@@ -3,12 +3,12 @@ use super::*;
/// Repository operations.
impl Forgejo {
/// Gets info about the specified repository.
- pub async fn get_repo(&self, user: &str, repo: &str) -> Result<Option<Repo>, ForgejoError> {
+ pub async fn get_repo(&self, user: &str, repo: &str) -> Result<Option<Repository>, ForgejoError> {
self.get_opt(&format!("repos/{user}/{repo}/")).await
}
/// Creates a repository.
- pub async fn create_repo(&self, repo: CreateRepoOption) -> Result<Repo, ForgejoError> {
+ pub async fn create_repo(&self, repo: CreateRepoOption) -> Result<Repository, ForgejoError> {
self.post("user/repos", &repo).await
}
@@ -216,17 +216,68 @@ impl Forgejo {
}
#[derive(serde::Deserialize, Debug, PartialEq)]
-pub struct Repo {
+pub struct Repository {
+ pub allow_merge_commits: bool,
+ pub allow_rebase: bool,
+ pub allow_rebase_explicit: bool,
+ pub allow_rebase_update: bool,
+ pub allow_squash_merge: bool,
+ pub archived: bool,
+ #[serde(with = "time::serde::rfc3339::option")]
+ pub archived_at: Option<time::OffsetDateTime>,
+ #[serde(deserialize_with = "crate::none_if_blank_url")]
+ pub avatar_url: Option<Url>,
pub clone_url: Url,
#[serde(with = "time::serde::rfc3339")]
pub created_at: time::OffsetDateTime,
+ pub default_allow_maintainer_edit: bool,
pub default_branch: String,
+ pub default_delete_branch_after_merge: bool,
+ pub default_merge_style: String,
pub description: String,
+ pub empty: bool,
+ pub external_tracker: Option<ExternalTracker>,
+ pub external_wiki: Option<ExternalWiki>,
pub fork: bool,
pub forks_count: u64,
pub full_name: String,
-
+ pub has_actions: bool,
+ pub has_issues: bool,
+ pub has_packages: bool,
+ pub has_projects: bool,
+ pub has_pull_request: bool,
+ pub has_releases: bool,
+ pub has_wiki: bool,
+ pub html_url: Url,
+ pub id: u64,
+ pub ignore_whitespace_conflicts: bool,
+ pub internal: bool,
+ pub internal_tracker: Option<InternalTracker>,
+ pub language: String,
+ pub languages_url: Url,
+ pub link: String,
+ pub mirror: bool,
+ pub mirror_interval: Option<String>,
+ #[serde(with = "time::serde::rfc3339::option")]
+ pub mirror_updated: Option<time::OffsetDateTime>,
+ pub name: String,
+ pub open_issue_count: u64,
+ pub open_pr_counter: u64,
+ pub original_url: Url,
pub owner: User,
+ pub permissions: Permission,
+ pub private: bool,
+ pub release_counter: u64,
+ pub repo_transfer: Option<RepoTransfer>,
+ pub size: u64,
+ pub ssh_url: Url,
+ pub starts_count: u64,
+ pub template: bool,
+ #[serde(with = "time::serde::rfc3339")]
+ pub updated_at: time::OffsetDateTime,
+ pub url: Url,
+ pub watchers_count: u64,
+ pub website: Option<String>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
@@ -324,7 +375,7 @@ pub struct PrBranchInfo {
pub label: String,
#[serde(rename = "ref")]
pub _ref: String,
- pub repo: Repo,
+ pub repo: Repository,
pub repo_id: u64,
pub sha: String,
}
@@ -571,3 +622,43 @@ pub struct CommitMeta {
pub url: Url,
pub sha: String,
}
+
+#[derive(serde::Deserialize, Debug, PartialEq)]
+pub struct ExternalTracker {
+ #[serde(rename = "external_tracker_format")]
+ pub format: String,
+ #[serde(rename = "external_tracker_regexp_pattern")]
+ pub regexp_pattern: String,
+ #[serde(rename = "external_tracker_style")]
+ pub style: String,
+ #[serde(rename = "external_tracker_url")]
+ pub url: Url,
+}
+
+#[derive(serde::Deserialize, Debug, PartialEq)]
+pub struct InternalTracker {
+ pub allow_only_contributors_to_track_time: bool,
+ pub enable_issue_dependencies: bool,
+ pub enable_time_tracker: bool,
+}
+
+#[derive(serde::Deserialize, Debug, PartialEq)]
+pub struct ExternalWiki {
+ #[serde(rename = "external_wiki_url")]
+ pub url: Url,
+}
+
+#[derive(serde::Deserialize, Debug, PartialEq)]
+pub struct Permission {
+ pub admin: bool,
+ pub pull: bool,
+ pub push: bool,
+}
+
+#[derive(serde::Deserialize, Debug, PartialEq)]
+pub struct RepoTransfer {
+ pub doer: User,
+ pub recipient: User,
+ pub teams: Vec<Team>,
+}
+