From 9073ea6939e71aefe11629b460ecb8c0ab313435 Mon Sep 17 00:00:00 2001 From: David Bernard Date: Wed, 10 Jun 2026 18:21:25 +0200 Subject: [PATCH 1/2] build: add the autofix task Signed-off-by: David Bernard --- .mise.toml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.mise.toml b/.mise.toml index 757161b..6c06862 100644 --- a/.mise.toml +++ b/.mise.toml @@ -20,6 +20,14 @@ run = [ "dprint fmt --config=tools/dprint/dprint.json", ] +[tasks.autofix] +description = "Automatically fix some linting issues & format code" +depends_post = ["format"] +run = [ + "cargo fix --allow-dirty --workspace --all-features --all-targets --profile test", + "cargo clippy --fix --allow-dirty --workspace --all-features --all-targets --no-deps --profile test", +] + [tasks.check] wait_for = ["generate"] run = "cargo hack check --each-feature" From 6e5f20690ea741749feb4ae6458861fe48bd74c9 Mon Sep 17 00:00:00 2001 From: David Bernard Date: Wed, 10 Jun 2026 18:29:01 +0200 Subject: [PATCH 2/2] fix(deps): support CDEvents 0.5.1 and update latest/draft of 0.6 Signed-off-by: David Bernard --- README.md | 4 +- .../src/generated/approval_closed_0_1_0.rs | 67 +++++++++++++++++++ .../src/generated/approval_created_0_1_0.rs | 33 +++++++++ .../src/generated/approval_updated_0_1_0.rs | 52 ++++++++++++++ cdevents-sdk/src/generated/mod.rs | 62 ++++++++++++++++- cdevents-specs/main | 2 +- cdevents-specs/spec-v0.5 | 2 +- 7 files changed, 217 insertions(+), 5 deletions(-) create mode 100644 cdevents-sdk/src/generated/approval_closed_0_1_0.rs create mode 100644 cdevents-sdk/src/generated/approval_created_0_1_0.rs create mode 100644 cdevents-sdk/src/generated/approval_updated_0_1_0.rs diff --git a/README.md b/README.md index c7252f8..5e88c98 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ To send a CDEvent as CloudEvent: // from examples/pipelinerun_finished.rs use std::error::Error; -use cdevents_sdk::{CDEvent, Subject, spec_0_5_0::pipelinerun_finished, Content}; +use cdevents_sdk::{CDEvent, Subject, spec_0_5_1::pipelinerun_finished, Content}; use cloudevents::{Event, AttributesReader}; fn main() -> Result<(), Box> { @@ -62,7 +62,7 @@ See the [CloudEvents](https://github.com/cloudevents/sdk-rust) docs as well. ## Features -- [x] support cdevents spec 0.5.0 +- [x] support cdevents spec 0.5.1 - [x] support cdevents spec 0.4.1 - [x] support cdevents spec 0.3.0 - [ ] support of custom event diff --git a/cdevents-sdk/src/generated/approval_closed_0_1_0.rs b/cdevents-sdk/src/generated/approval_closed_0_1_0.rs new file mode 100644 index 0000000..e5feef0 --- /dev/null +++ b/cdevents-sdk/src/generated/approval_closed_0_1_0.rs @@ -0,0 +1,67 @@ +// @generated +// by cdevents/sdk-rust/generator (subject.hbs) + +#[cfg(feature = "testkit")] use proptest_derive::Arbitrary; +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "testkit", derive(Arbitrary))] +#[serde(deny_unknown_fields)] +pub struct Content { + #[serde(rename = "approvalDetailsUrl",)] + pub approval_details_url: crate::NonEmptyString, + #[serde(rename = "decision",)] + pub decision: ContentDecision, + #[serde(rename = "resourceTargetUrl",)] + pub resource_target_url: crate::NonEmptyString, + #[serde(rename = "responder",)] + pub responder: crate::Uri, + #[serde(rename = "status",)] + pub status: ContentStatu, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +#[cfg_attr(feature = "testkit", derive(Arbitrary))] +pub enum ContentDecision { + #[serde(rename = "escalated")] + Escalated, + #[serde(rename = "delegate")] + Delegate, + #[serde(rename = "deferred")] + Deferred, + #[serde(rename = "requestChanges")] + RequestChange, + #[serde(rename = "approved")] + Approved, + #[serde(rename = "rejected")] + Rejected, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +#[cfg_attr(feature = "testkit", derive(Arbitrary))] +pub enum ContentStatu { + #[serde(rename = "approved")] + Approved, + #[serde(rename = "rejected")] + Rejected, + #[serde(rename = "cancelled")] + Cancelled, + #[serde(rename = "expired")] + Expired, +} + +#[cfg(test)] +mod tests { + use proptest::prelude::*; + use super::*; + + proptest! { + #[test] + #[cfg(feature = "testkit")] + fn arbitraries_are_json_valid(s in any::()) { + let json_str = serde_json::to_string(&s).unwrap(); + let actual = serde_json::from_str::(&json_str).unwrap(); + assert_eq!(s, actual); + } + } +} diff --git a/cdevents-sdk/src/generated/approval_created_0_1_0.rs b/cdevents-sdk/src/generated/approval_created_0_1_0.rs new file mode 100644 index 0000000..22313a9 --- /dev/null +++ b/cdevents-sdk/src/generated/approval_created_0_1_0.rs @@ -0,0 +1,33 @@ +// @generated +// by cdevents/sdk-rust/generator (subject.hbs) + +#[cfg(feature = "testkit")] use proptest_derive::Arbitrary; +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "testkit", derive(Arbitrary))] +#[serde(deny_unknown_fields)] +pub struct Content { + #[serde(rename = "approvalDetailsUrl",)] + pub approval_details_url: crate::NonEmptyString, + #[serde(rename = "requestor",)] + pub requestor: crate::Uri, + #[serde(rename = "resourceTargetUrl",)] + pub resource_target_url: crate::NonEmptyString, +} + +#[cfg(test)] +mod tests { + use proptest::prelude::*; + use super::*; + + proptest! { + #[test] + #[cfg(feature = "testkit")] + fn arbitraries_are_json_valid(s in any::()) { + let json_str = serde_json::to_string(&s).unwrap(); + let actual = serde_json::from_str::(&json_str).unwrap(); + assert_eq!(s, actual); + } + } +} diff --git a/cdevents-sdk/src/generated/approval_updated_0_1_0.rs b/cdevents-sdk/src/generated/approval_updated_0_1_0.rs new file mode 100644 index 0000000..6c2b1be --- /dev/null +++ b/cdevents-sdk/src/generated/approval_updated_0_1_0.rs @@ -0,0 +1,52 @@ +// @generated +// by cdevents/sdk-rust/generator (subject.hbs) + +#[cfg(feature = "testkit")] use proptest_derive::Arbitrary; +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[cfg_attr(feature = "testkit", derive(Arbitrary))] +#[serde(deny_unknown_fields)] +pub struct Content { + #[serde(rename = "approvalDetailsUrl",)] + pub approval_details_url: crate::NonEmptyString, + #[serde(rename = "decision",)] + pub decision: ContentDecision, + #[serde(rename = "resourceTargetUrl",)] + pub resource_target_url: crate::NonEmptyString, + #[serde(rename = "responder",)] + pub responder: crate::Uri, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +#[cfg_attr(feature = "testkit", derive(Arbitrary))] +pub enum ContentDecision { + #[serde(rename = "escalated")] + Escalated, + #[serde(rename = "delegate")] + Delegate, + #[serde(rename = "deferred")] + Deferred, + #[serde(rename = "requestChanges")] + RequestChange, + #[serde(rename = "approved")] + Approved, + #[serde(rename = "rejected")] + Rejected, +} + +#[cfg(test)] +mod tests { + use proptest::prelude::*; + use super::*; + + proptest! { + #[test] + #[cfg(feature = "testkit")] + fn arbitraries_are_json_valid(s in any::()) { + let json_str = serde_json::to_string(&s).unwrap(); + let actual = serde_json::from_str::(&json_str).unwrap(); + assert_eq!(s, actual); + } + } +} diff --git a/cdevents-sdk/src/generated/mod.rs b/cdevents-sdk/src/generated/mod.rs index d3db9e3..7389c62 100644 --- a/cdevents-sdk/src/generated/mod.rs +++ b/cdevents-sdk/src/generated/mod.rs @@ -3,6 +3,9 @@ use serde::{Serialize, Deserialize, de::Error}; +pub mod approval_closed_0_1_0; +pub mod approval_created_0_1_0; +pub mod approval_updated_0_1_0; pub mod artifact_deleted_0_2_0; pub mod artifact_deleted_0_1_0; pub mod artifact_downloaded_0_2_0; @@ -134,6 +137,9 @@ pub mod ticket_updated_0_2_0; pub mod ticket_updated_0_1_0; pub mod latest { + pub use super::approval_closed_0_1_0 as approval_closed; + pub use super::approval_created_0_1_0 as approval_created; + pub use super::approval_updated_0_1_0 as approval_updated; pub use super::artifact_deleted_0_2_0 as artifact_deleted; pub use super::artifact_downloaded_0_2_0 as artifact_downloaded; pub use super::artifact_packaged_0_3_0 as artifact_packaged; @@ -268,7 +274,7 @@ pub mod spec_0_4_1 { pub use super::ticket_created_0_1_0 as ticket_created; pub use super::ticket_updated_0_1_0 as ticket_updated; } -pub mod spec_0_5_0 { +pub mod spec_0_5_1 { pub use super::artifact_deleted_0_2_0 as artifact_deleted; pub use super::artifact_downloaded_0_2_0 as artifact_downloaded; pub use super::artifact_packaged_0_3_0 as artifact_packaged; @@ -316,6 +322,9 @@ pub mod spec_0_5_0 { pub use super::ticket_updated_0_2_0 as ticket_updated; } pub mod spec_0_6_0_draft { + pub use super::approval_closed_0_1_0 as approval_closed; + pub use super::approval_created_0_1_0 as approval_created; + pub use super::approval_updated_0_1_0 as approval_updated; pub use super::artifact_deleted_0_2_0 as artifact_deleted; pub use super::artifact_downloaded_0_2_0 as artifact_downloaded; pub use super::artifact_packaged_0_3_0 as artifact_packaged; @@ -363,6 +372,9 @@ pub mod spec_0_6_0_draft { pub use super::ticket_updated_0_2_0 as ticket_updated; } +pub const APPROVAL_CLOSED_0_1_0: &str = "dev.cdevents.approval.closed.0.1.0"; +pub const APPROVAL_CREATED_0_1_0: &str = "dev.cdevents.approval.created.0.1.0"; +pub const APPROVAL_UPDATED_0_1_0: &str = "dev.cdevents.approval.updated.0.1.0"; pub const ARTIFACT_DELETED_0_2_0: &str = "dev.cdevents.artifact.deleted.0.2.0"; pub const ARTIFACT_DELETED_0_1_0: &str = "dev.cdevents.artifact.deleted.0.1.0"; pub const ARTIFACT_DOWNLOADED_0_2_0: &str = "dev.cdevents.artifact.downloaded.0.2.0"; @@ -496,6 +508,9 @@ pub const TICKET_UPDATED_0_1_0: &str = "dev.cdevents.ticket.updated.0.1.0"; #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(untagged)] // TODO how to use content of context.type as discriminator ? pub enum Content { + ApprovalClosed010(approval_closed_0_1_0::Content), + ApprovalCreated010(approval_created_0_1_0::Content), + ApprovalUpdated010(approval_updated_0_1_0::Content), ArtifactDeleted020(artifact_deleted_0_2_0::Content), ArtifactDeleted010(artifact_deleted_0_1_0::Content), ArtifactDownloaded020(artifact_downloaded_0_2_0::Content), @@ -636,6 +651,18 @@ pub enum Content { impl Content { pub fn from_json(ty: &str, json: serde_json::Value) -> Result{ match ty { + APPROVAL_CLOSED_0_1_0 => { + let variant: approval_closed_0_1_0::Content = serde_json::from_value(json)?; + Ok(variant.into()) + }, + APPROVAL_CREATED_0_1_0 => { + let variant: approval_created_0_1_0::Content = serde_json::from_value(json)?; + Ok(variant.into()) + }, + APPROVAL_UPDATED_0_1_0 => { + let variant: approval_updated_0_1_0::Content = serde_json::from_value(json)?; + Ok(variant.into()) + }, ARTIFACT_DELETED_0_2_0 => { let variant: artifact_deleted_0_2_0::Content = serde_json::from_value(json)?; Ok(variant.into()) @@ -1165,6 +1192,9 @@ impl Content { pub fn ty(&self) -> &str { match self { + Self::ApprovalClosed010(_) => APPROVAL_CLOSED_0_1_0, + Self::ApprovalCreated010(_) => APPROVAL_CREATED_0_1_0, + Self::ApprovalUpdated010(_) => APPROVAL_UPDATED_0_1_0, Self::ArtifactDeleted020(_) => ARTIFACT_DELETED_0_2_0, Self::ArtifactDeleted010(_) => ARTIFACT_DELETED_0_1_0, Self::ArtifactDownloaded020(_) => ARTIFACT_DOWNLOADED_0_2_0, @@ -1300,6 +1330,9 @@ impl Content { pub fn subject(&self) -> &str { match self { + Self::ApprovalClosed010(_) => "", + Self::ApprovalCreated010(_) => "", + Self::ApprovalUpdated010(_) => "", Self::ArtifactDeleted020(_) => "", Self::ArtifactDeleted010(_) => "artifact", Self::ArtifactDownloaded020(_) => "", @@ -1435,6 +1468,9 @@ impl Content { pub fn predicate(&self) -> &str { match self { + Self::ApprovalClosed010(_) => "closed", + Self::ApprovalCreated010(_) => "created", + Self::ApprovalUpdated010(_) => "updated", Self::ArtifactDeleted020(_) => "deleted", Self::ArtifactDeleted010(_) => "deleted", Self::ArtifactDownloaded020(_) => "downloaded", @@ -1755,6 +1791,21 @@ pub(crate) fn new_context(ty: &str) -> crate::context::ContextEnum { } } +impl From for Content { + fn from(value: approval_closed_0_1_0::Content) -> Self { + Self::ApprovalClosed010(value) + } +} +impl From for Content { + fn from(value: approval_created_0_1_0::Content) -> Self { + Self::ApprovalCreated010(value) + } +} +impl From for Content { + fn from(value: approval_updated_0_1_0::Content) -> Self { + Self::ApprovalUpdated010(value) + } +} impl From for Content { fn from(value: artifact_deleted_0_2_0::Content) -> Self { Self::ArtifactDeleted020(value) @@ -2409,6 +2460,9 @@ impl<> proptest::arbitrary::Arbitrary for Content { fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { use proptest::prelude::*; prop_oneof![ + any::().prop_map(Content::from), + any::().prop_map(Content::from), + any::().prop_map(Content::from), any::().prop_map(Content::from), any::().prop_map(Content::from), any::().prop_map(Content::from), @@ -2549,6 +2603,12 @@ impl<> proptest::arbitrary::Arbitrary for Content { // #[test] // fn test_true() { // +// assert_eq!(extract_subject_predicate(APPROVAL_CLOSED_0_1_0), Some(("approval","closed"))); +// +// assert_eq!(extract_subject_predicate(APPROVAL_CREATED_0_1_0), Some(("approval","created"))); +// +// assert_eq!(extract_subject_predicate(APPROVAL_UPDATED_0_1_0), Some(("approval","updated"))); +// // assert_eq!(extract_subject_predicate(ARTIFACT_DELETED_0_2_0), Some(("artifact","deleted"))); // // assert_eq!(extract_subject_predicate(ARTIFACT_DELETED_0_1_0), Some(("artifact","deleted"))); diff --git a/cdevents-specs/main b/cdevents-specs/main index e11db2f..73ae696 160000 --- a/cdevents-specs/main +++ b/cdevents-specs/main @@ -1 +1 @@ -Subproject commit e11db2f7c96b0665ce80c860314441858e9c2c1e +Subproject commit 73ae69614174bf8723f18a03401b31e6b1a01c6d diff --git a/cdevents-specs/spec-v0.5 b/cdevents-specs/spec-v0.5 index 8e09a2d..c042813 160000 --- a/cdevents-specs/spec-v0.5 +++ b/cdevents-specs/spec-v0.5 @@ -1 +1 @@ -Subproject commit 8e09a2dcde760d0cfac674cc703df4ca7236d4ab +Subproject commit c0428137807a85b237ab32e3602117ea027fd3a9