From af026a8526fc13923e3fe54041bcc82592e2c245 Mon Sep 17 00:00:00 2001 From: Johan Peltenburg Date: Mon, 27 Jul 2026 11:25:46 +0200 Subject: [PATCH 1/2] fix(instrumentation-build): skip empty AnyEvent Signed-off-by: Johan Peltenburg --- crates/instrumentation-build/src/lib.rs | 27 ++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/crates/instrumentation-build/src/lib.rs b/crates/instrumentation-build/src/lib.rs index 00b67533e..29ef6fb13 100644 --- a/crates/instrumentation-build/src/lib.rs +++ b/crates/instrumentation-build/src/lib.rs @@ -97,6 +97,8 @@ pub struct Options { /// Emit `AnyEvent` and `AnyEvent::from_any`, a decoder from a type-erased /// `&dyn Any` back to the concrete `Event`. Carries [`Self::event_derives`]. + /// + /// No aggregate is emitted when the schema declares no events. pub any_event: bool, } @@ -188,7 +190,10 @@ pub fn generate_str(schema: &Schema, opts: &Options) -> Result Result<(), GenerateError> { None => Ok(()), } } + +#[cfg(test)] +mod tests { + use super::*; + use quent_schema::builder::SchemaBuilder; + use quent_schema::test_utils::ident; + + #[test] + fn skips_any_event_without_events() { + let schema = SchemaBuilder::new(ident("Demo")).build().unwrap(); + let options = Options { + any_event: true, + ..Options::default() + }; + + let source = generate_str(&schema, &options).unwrap(); + + assert!(!source.contains("enum AnyEvent")); + } +} From c577e3e033e5a5dd3279c08daab651dd880ac9dd Mon Sep 17 00:00:00 2001 From: Johan Peltenburg Date: Mon, 27 Jul 2026 11:53:46 +0200 Subject: [PATCH 2/2] refactor(instrumentation-build): handle empty AnyEvent locally Signed-off-by: Johan Peltenburg --- crates/instrumentation-build/src/any_event.rs | 17 +++++++++++-- crates/instrumentation-build/src/lib.rs | 25 +------------------ 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/crates/instrumentation-build/src/any_event.rs b/crates/instrumentation-build/src/any_event.rs index eaccbb826..3cc58734b 100644 --- a/crates/instrumentation-build/src/any_event.rs +++ b/crates/instrumentation-build/src/any_event.rs @@ -23,8 +23,6 @@ pub(crate) fn generate_any_event( schema: &Schema, opts: &Options, ) -> Result { - let derives = derive_attr(opts.event_derives)?; - let variants: Vec<(Ident, Ident)> = schema .entities() .map(|entity| { @@ -35,7 +33,11 @@ pub(crate) fn generate_any_event( ) }) .collect(); + if variants.is_empty() { + return Ok(quote! {}); + } + let derives = derive_attr(opts.event_derives)?; let decls = variants.iter().map(|(variant, event)| { quote! { #variant(&'a ::quent_instrumentation::Event<#event>) } }); @@ -118,4 +120,15 @@ mod tests { pretty(expected) ); } + + #[test] + fn emits_nothing_without_entities() { + let schema = SchemaBuilder::new(ident("Demo")).build().unwrap(); + + assert!( + generate_any_event(&schema, &Options::default()) + .unwrap() + .is_empty() + ); + } } diff --git a/crates/instrumentation-build/src/lib.rs b/crates/instrumentation-build/src/lib.rs index 29ef6fb13..eeabbdd2d 100644 --- a/crates/instrumentation-build/src/lib.rs +++ b/crates/instrumentation-build/src/lib.rs @@ -190,10 +190,7 @@ pub fn generate_str(schema: &Schema, opts: &Options) -> Result Result<(), GenerateError> { None => Ok(()), } } - -#[cfg(test)] -mod tests { - use super::*; - use quent_schema::builder::SchemaBuilder; - use quent_schema::test_utils::ident; - - #[test] - fn skips_any_event_without_events() { - let schema = SchemaBuilder::new(ident("Demo")).build().unwrap(); - let options = Options { - any_event: true, - ..Options::default() - }; - - let source = generate_str(&schema, &options).unwrap(); - - assert!(!source.contains("enum AnyEvent")); - } -}