Skip to main content

kellnr_common/
webhook.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
5pub struct Webhook {
6    pub id: Option<String>,
7    pub event: WebhookEvent,
8    pub callback_url: String,
9    pub name: Option<String>,
10}
11
12#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13pub struct WebhookQueue {
14    pub id: String,
15    pub callback_url: String,
16    pub payload: serde_json::Value,
17    pub last_attempt: Option<DateTime<Utc>>,
18    pub next_attempt: DateTime<Utc>,
19}
20
21#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
22#[allow(clippy::enum_variant_names)]
23pub enum WebhookEvent {
24    #[serde(rename = "crate_add")]
25    CrateAdd,
26    #[serde(rename = "crate_update")]
27    CrateUpdate,
28    #[serde(rename = "crate_yank")]
29    CrateYank,
30    #[serde(rename = "crate_unyank")]
31    CrateUnyank,
32}
33impl From<WebhookEvent> for &str {
34    fn from(value: WebhookEvent) -> Self {
35        match value {
36            WebhookEvent::CrateAdd => "crate_add",
37            WebhookEvent::CrateUpdate => "crate_update",
38            WebhookEvent::CrateYank => "crate_yank",
39            WebhookEvent::CrateUnyank => "crate_unyank",
40        }
41    }
42}
43impl TryFrom<&str> for WebhookEvent {
44    type Error = String;
45    fn try_from(value: &str) -> Result<Self, Self::Error> {
46        match value {
47            "crate_add" => Ok(Self::CrateAdd),
48            "crate_update" => Ok(Self::CrateUpdate),
49            "crate_yank" => Ok(Self::CrateYank),
50            "crate_unyank" => Ok(Self::CrateUnyank),
51            a => Err(format!("'{a}' is not a valid webhook event")),
52        }
53    }
54}