ene_kafka_derive 0.2.0

Derive macros used for Ene Kafka
Documentation
use syn::DeriveInput;

#[derive(deluxe::ExtractAttributes)]
#[deluxe(attributes(cloud_event))]
struct CloudEventAttributes {
    content_type: String,
    #[deluxe(default = "1.0".to_string())]
    version: String,
    event_type: String,
    event_source: String,
    id: syn::Ident,
}

pub fn cloudevent_derive_macro2(
    input: proc_macro2::TokenStream,
) -> deluxe::Result<proc_macro2::TokenStream> {
    let mut ast: DeriveInput = syn::parse2(input.into())?;
    let CloudEventAttributes {
        content_type,
        version,
        event_type,
        event_source,
        id,
    }: CloudEventAttributes = deluxe::extract_attributes(&mut ast)?;
    let struct_name = &ast.ident;
    let (impl_generics, type_generics, where_clause) = ast.generics.split_for_impl();
    let id_ident = syn::Ident::new(&id.to_string(), struct_name.span());

    Ok(quote::quote! {
        impl #impl_generics ene_kafka::messages::cloud_events::cloud_event::CloudEvent<String, String> for #struct_name #type_generics #where_clause {
            fn spec_version(&self) -> ene_kafka::KafkaResult<String> {
                Ok(#version.to_string())
            }

            fn event_type(&self) -> ene_kafka::KafkaResult<String> {
                Ok(#event_type.to_string())
            }

            fn event_source(&self) -> ene_kafka::KafkaResult<String> {
                Ok(#event_source.to_string())
            }

            fn event_id(&self) -> ene_kafka::KafkaResult<String> {
                Ok(self.#id_ident.to_string())
            }

            fn event_time(&self) -> ene_kafka::KafkaResult<String> {
                Ok(chrono::Utc::now().to_rfc3339())
            }

            fn event_content_type(&self) -> ene_kafka::KafkaResult<String> {
                Ok(#content_type.to_string())
            }

            fn entity_event_type() -> ene_kafka::KafkaResult<String> {
                Ok(#event_type.to_string())
            }
        }
    })
}