async-debug-derive 0.1.3

Derive macro for async-debug: Debug structs and enums containing values that require an async call to render
Documentation
use proc_macro2::{Ident, TokenStream};
use quote::quote;
use syn::{Field, Variant};

use crate::{
    fields::{AsyncDebugFields, AsyncDebugFieldsMap},
    Result,
};

pub struct AsyncDebugVariantNamed {
    variant: Variant,
    enum_ident: Ident,
    fields: AsyncDebugFieldsMap,
}

impl AsyncDebugFields for AsyncDebugVariantNamed {
    fn get_fields(&self) -> &AsyncDebugFieldsMap {
        &self.fields
    }
}

impl AsyncDebugVariantNamed {
    pub fn new(variant: Variant, enum_ident: Ident, fields: Vec<Field>) -> Result<Self> {
        Ok(Self {
            fields: Self::convert_fields(fields.iter().collect(), Some(variant.ident.clone()))?,
            variant,
            enum_ident,
        })
    }

    pub fn to_token_stream_impl_ident_body(&self, mod_ident: &Ident) -> Result<TokenStream> {
        let ident = &self.variant.ident;
        let enum_ident = &self.enum_ident;
        let field_idents = self.fields.keys().collect::<Vec<_>>();

        let token_stream_impl_ident_body =
            <Self as AsyncDebugFields>::to_token_stream_impl_ident_body(self, None)?;

        Ok(quote! {
            Self::#ident { #(#field_idents),* } => #mod_ident::#enum_ident::#ident {
                #token_stream_impl_ident_body
            },
        })
    }

    pub fn to_token_stream(&self) -> Result<TokenStream> {
        let ident = &self.variant.ident;

        let fields_type = self.get_fields_type();

        Ok(quote! {
            #ident {
                #fields_type
            },
        })
    }
}