use super::store::OperationQueue;
use crate::io::ApiResult;
use acorn_core::prelude::String;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase", tag = "event")]
pub enum ArtifactEvent {
#[serde(rename = "artifact-ready")]
ArtifactReady {
checksum: String,
package_url: String,
project_id: String,
through: String,
},
#[serde(rename = "failed")]
Failed {
message: String,
project_id: String,
},
#[serde(rename = "mr-created")]
MergeRequestCreated {
merge_request_url: String,
project_id: String,
},
#[serde(rename = "report-no-changes")]
ReportNoChanges {
project_id: String,
through: String,
},
#[serde(rename = "review-needed")]
ReviewNeeded {
merge_request_url: String,
project_id: String,
},
}
impl ArtifactEvent {
pub fn enqueue(&self, queue: &OperationQueue, destination: &str, idempotency_key: &str) -> ApiResult<bool> {
queue.enqueue_callback(&format!("webhook:{}:{idempotency_key}", self.kind()), destination, self)
}
fn kind(&self) -> &'static str {
self.into()
}
}
impl From<&ArtifactEvent> for &'static str {
fn from(value: &ArtifactEvent) -> Self {
match value {
| ArtifactEvent::ArtifactReady { .. } => "artifact-ready",
| ArtifactEvent::Failed { .. } => "failed",
| ArtifactEvent::MergeRequestCreated { .. } => "mr-created",
| ArtifactEvent::ReportNoChanges { .. } => "report-no-changes",
| ArtifactEvent::ReviewNeeded { .. } => "review-needed",
}
}
}