Framework for embedding localizations into Rust types
macro_rules! impl_serialize {
    // Handle no extra const generics
    ($container:ident, $field_name:ident) => {
        impl_serialize!($container, $field_name,);
    };
    ($container:ident, $field_name:ident, $($const_name:ident: $const_type:ty),*) => {
        impl<M: crate::Localize + serde::Serialize, $(const $const_name: $const_type),*> serde::Serialize for $container<M, $($const_name),*> {
            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
            where
                S: serde::Serializer,
            {
                self.$field_name.serialize(serializer)
            }
        }

        // impl<M: crate::Localize + std::fmt::Debug, $(const $const_name: $const_type),*> std::fmt::Debug for $container<M, $($const_name),*> {
        //     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        //         self.$field_name.fmt(f)
        //     }
        // }
    };
}

// Re-export the macro so other modules can use it
pub(crate) use impl_serialize;