aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md8
-rw-r--r--mingling_macros/src/chain.rs6
-rw-r--r--mingling_macros/src/lib.rs18
3 files changed, 26 insertions, 6 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8bee517..de97204 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -380,6 +380,14 @@ let value = route!(prev.pick_or_route((), Error::default()).unpack());
9. **\[core\]** **\[structural_renderer\]** Added `mingling::__private::StructuralDataSealed` and `mingling::__private::StructuralData` (re-exported from `mingling_core::renderer::structural::structural_data`) to support the sealed trait pattern. The `StructuralData` trait is only implementable via the derive macro or the `_structural` macro variants.
+10. **\[macros\]** Changed `ResultEmpty` from a tuple struct (wrapping `()`) to a fieldless unit struct. `ResultEmpty::new(())` is now simply `ResultEmpty`. This simplifies construction and reduces generated code.
+
+- `pack!(ResultEmpty = ())` → `#[derive(...)] pub struct ResultEmpty;`
+- `crate::ResultEmpty::new(())` → `crate::ResultEmpty`
+- Updated all references in `#[chain]` code generation, `empty_result!()` macro, and `program_fallback_gen`/`program_final_gen` accordingly.
+
+When the `structural_renderer` feature is enabled, `ResultEmpty` also derives `Serialize` and `StructuralData` for consistency with structured output support.
+
### Release 0.1.9 (2026-05-29)
#### Fixes:
diff --git a/mingling_macros/src/chain.rs b/mingling_macros/src/chain.rs
index 2abf3c1..6191d39 100644
--- a/mingling_macros/src/chain.rs
+++ b/mingling_macros/src/chain.rs
@@ -83,7 +83,7 @@ fn generate_proc_fn(
stmts.push(syn::Stmt::Expr(
syn::parse_quote! {
<crate::ResultEmpty as ::mingling::Groupped::<crate::ThisProgram>>
- ::to_chain(crate::ResultEmpty::new(()))
+ ::to_chain(crate::ResultEmpty)
},
None,
));
@@ -111,7 +111,7 @@ fn generate_proc_fn(
quote! {
#call
<crate::ResultEmpty as ::mingling::Groupped::<crate::ThisProgram>>
- ::to_chain(crate::ResultEmpty::new(()))
+ ::to_chain(crate::ResultEmpty)
}
}
} else if has_resources {
@@ -169,7 +169,7 @@ fn generate_original_fn(
quote! {
{
#fn_body
- <crate::ResultEmpty as ::mingling::Groupped::<crate::ThisProgram>>::to_chain(crate::ResultEmpty::new(()))
+ <crate::ResultEmpty as ::mingling::Groupped::<crate::ThisProgram>>::to_chain(crate::ResultEmpty)
}
}
} else {
diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs
index ad3b6a9..c239a55 100644
--- a/mingling_macros/src/lib.rs
+++ b/mingling_macros/src/lib.rs
@@ -590,7 +590,7 @@ pub fn route(input: TokenStream) -> TokenStream {
#[proc_macro]
pub fn empty_result(_input: TokenStream) -> TokenStream {
let expanded = quote! {
- <crate::ResultEmpty as ::mingling::Groupped::<crate::ThisProgram>>::to_chain(crate::ResultEmpty::new(()))
+ <crate::ResultEmpty as ::mingling::Groupped::<crate::ThisProgram>>::to_chain(crate::ResultEmpty)
};
TokenStream::from(expanded)
}
@@ -1688,10 +1688,22 @@ pub fn register_renderer(input: TokenStream) -> TokenStream {
/// ```
#[proc_macro]
pub fn program_fallback_gen(_input: TokenStream) -> TokenStream {
+ #[cfg(feature = "structural_renderer")]
+ let pack_empty = quote! {
+ #[derive(::serde::Serialize, ::mingling::StructuralData, ::mingling::Groupped, Default)]
+ pub struct ResultEmpty;
+ };
+
+ #[cfg(not(feature = "structural_renderer"))]
+ let pack_empty = quote! {
+ #[derive(::mingling::Groupped, Default)]
+ pub struct ResultEmpty;
+ };
+
let expanded = quote! {
::mingling::macros::pack!(ErrorRendererNotFound = String);
::mingling::macros::pack!(ErrorDispatcherNotFound = Vec<String>);
- ::mingling::macros::pack!(ResultEmpty = ());
+ #pack_empty
};
TokenStream::from(expanded)
}
@@ -2025,7 +2037,7 @@ pub fn program_final_gen(_input: TokenStream) -> TokenStream {
::mingling::AnyOutput::new(ErrorDispatcherNotFound::new(args))
}
fn build_empty_result() -> ::mingling::AnyOutput<Self::Enum> {
- ::mingling::AnyOutput::new(ResultEmpty::new(()))
+ ::mingling::AnyOutput::new(ResultEmpty)
}
#render_fn
#do_chain_fn