Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Webhook events payload deserialization #427

Merged
merged 1 commit into from
Jul 30, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/api/orgs.rs
Original file line number Diff line number Diff line change
@@ -178,11 +178,11 @@ impl<'octo> OrgHandler<'octo> {
/// ```no_run
/// # async fn run() -> octocrab::Result<()> {
/// # let octocrab = octocrab::Octocrab::default();
/// use octocrab::models::hooks::{Hook, Config as HookConfig};
/// use octocrab::models::hooks::{Hook, Config as HookConfig, ContentType as HookContentType};
///
/// let config = HookConfig {
/// url: "https://example.com".to_string(),
/// content_type: Some("json".to_string()),
/// content_type: Some(HookContentType::Json),
/// insecure_ssl: None,
/// secret: None
/// };
19 changes: 19 additions & 0 deletions src/models.rs
Original file line number Diff line number Diff line change
@@ -22,6 +22,7 @@ pub mod reactions;
pub mod repos;
pub mod teams;
pub mod timelines;
pub mod webhook_events;
pub mod workflows;

pub use apps::App;
@@ -97,6 +98,7 @@ id_type!(
AppId,
ArtifactId,
AssetId,
BranchProtectionRuleId,
CardId,
CheckSuiteId,
CheckRunId,
@@ -105,6 +107,7 @@ id_type!(
IssueEventId,
IssueId,
JobId,
HookId,
LabelId,
MilestoneId,
NotificationId,
@@ -403,6 +406,22 @@ pub struct Author {
pub site_admin: bool,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[non_exhaustive]
pub enum AuthorAssociation {
Collaborator,
Contributor,
FirstTimer,
FirstTimeContributor,
Mannequin,
Member,
None,
Owner,
#[serde(untagged)]
Other(String),
}

#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Collaborator {
4 changes: 0 additions & 4 deletions src/models/events.rs
Original file line number Diff line number Diff line change
@@ -15,10 +15,6 @@ use serde::{de::Error, Deserialize, Serialize};
use url::Url;

/// A GitHub event.
///
/// If you want to deserialize a webhook payload received in a Github Application, you
/// must directly deserialize the body into a [`WrappedEventPayload`](WrappedEventPayload).
/// For webhooks, the event type is stored in the `X-GitHub-Event` header.
#[derive(Debug, Clone, PartialEq, Serialize)]
#[non_exhaustive]
pub struct Event {
40 changes: 37 additions & 3 deletions src/models/hooks.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,33 @@
use super::*;
use super::{webhook_events::WebhookEventType, *};

#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct Hook {
pub r#type: String,
pub active: bool,
/// Only included in webhook payload received by GitHub Apps. When you
/// register a new GitHub App, GitHub sends a ping event to the webhook URL
/// you specified during registration. The GitHub App ID sent in this field
/// is required for authenticating an app.
#[serde(skip_serializing_if = "Option::is_none")]
pub app_id: Option<AppId>,
pub id: u64,
/// The type of webhook. At the time of writing, the only valid value is
/// 'web'
pub name: String,
pub events: Vec<String>,
pub events: Vec<WebhookEventType>,
pub config: Config,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_response: Option<LastResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ping_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deliveries_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub test_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
@@ -22,10 +37,29 @@ pub struct Hook {
#[serde(rename_all = "snake_case")]
pub struct Config {
#[serde(skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
pub content_type: Option<ContentType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub insecure_ssl: Option<String>,
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub secret: Option<String>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LastResponse {
pub code: Option<i64>,
pub status: Option<String>,
pub message: Option<String>,
}

#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "snake_case")]
pub enum ContentType {
Json,
#[default]
Form,
#[serde(untagged)]
Other(String),
}
14 changes: 11 additions & 3 deletions src/models/pulls.rs
Original file line number Diff line number Diff line change
@@ -78,7 +78,7 @@ pub struct PullRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Box<Links>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub author_association: Option<String>,
pub author_association: Option<AuthorAssociation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub draft: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
@@ -255,13 +255,13 @@ pub struct Comment {
pub commit_id: String,
pub original_commit_id: String,
#[serde(default)]
pub in_reply_to_id: Option<u64>,
pub in_reply_to_id: Option<CommentId>,
pub user: Option<Author>,
pub body: String,
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
pub html_url: String,
pub author_association: String,
pub author_association: AuthorAssociation,
#[serde(rename = "_links")]
pub links: Links,
pub start_line: Option<u64>,
@@ -272,6 +272,14 @@ pub struct Comment {
pub side: Option<String>,
}

/// A Thread in a pull request review
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Thread {
pub comments: Vec<Comment>,
pub node_id: String,
}

// This is rather annoying, but Github uses both SCREAMING_SNAKE_CASE and snake_case
// for the review state, it's uppercase when coming from an API request, but
// lowercase when coming from a webhook payload, so we need to deserialize both,
2 changes: 1 addition & 1 deletion src/models/reactions.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use super::*;

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReactionContent {
#[serde(rename = "heart")]
Heart,
5 changes: 4 additions & 1 deletion src/models/repos.rs
Original file line number Diff line number Diff line change
@@ -130,14 +130,17 @@ pub struct Commit {
pub committer: Option<CommitAuthor>,
}

/// The author of a commit, identified by its name and email, as well as (optionally) a time
/// The author of a commit, identified by its name and email, as well as (optionally) a time and a github username
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GitUserTime {
#[serde(flatten)]
pub user: CommitAuthor,

#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<DateTime<Utc>>,

#[serde(skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
}

/// The author of a commit, identified by its name and email.
13 changes: 11 additions & 2 deletions src/models/teams.rs
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ pub struct Team {
pub name: String,
pub slug: String,
pub description: Option<String>,
pub privacy: String,
pub privacy: TeamPrivacy,
pub permission: String,
pub members_url: Url,
pub repositories_url: Url,
@@ -49,7 +49,7 @@ pub struct RequestedTeam {
pub slug: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub privacy: String,
pub privacy: TeamPrivacy,
pub permission: String,
pub members_url: Url,
pub repositories_url: Url,
@@ -76,3 +76,12 @@ pub struct TeamInvitation {
pub node_id: String,
pub invitation_teams_url: String,
}

#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum TeamPrivacy {
Open,
Closed,
Secret,
}
Loading