enum_delegate_lib/generate/
helper_mod.rs

1//! Code generation for a helper mod
2
3use proc_macro2::{Ident, TokenStream};
4use quote::{format_ident, quote};
5use syn::{ItemEnum, ItemTrait};
6
7/// A unique name for the helper mod.
8pub fn helper_mod_name(parsed_trait: &ItemTrait, parsed_enum: &ItemEnum) -> Ident {
9    format_ident!(
10        "enum_delegate_helpers_{}_for_{}",
11        parsed_trait.ident,
12        parsed_enum.ident,
13    )
14}
15
16/// Generate the helper mod definition
17pub fn generate_helper_mod(mod_name: &Ident) -> TokenStream {
18    quote! {
19        #[allow(non_snake_case)]
20        mod #mod_name {
21            /// Indicates that a pair of types (A, B) are the same
22            ///
23            /// Used in generated where-clauses as a workaround for https://github.com/rust-lang/rust/issues/20041
24            pub trait EqualTypes: private::Sealed {}
25
26            impl<T> EqualTypes for (T, T) {}
27
28            mod private {
29                pub trait Sealed {}
30
31                impl<T> Sealed for (T, T) {}
32            }
33        }
34    }
35}