fluvio-protocol-derive 0.50.1

Procedure macro to encode/decode fluvio protocol
Documentation
use crate::ast::prop::{NamedProp, UnnamedProp};
use syn::{Fields, Generics, Ident, ItemStruct};

pub(crate) enum FluvioStruct {
    Named(FluvioNamedStruct),
    Tuple(FluvioTupleStruct),
}

pub(crate) struct FluvioNamedStruct {
    pub struct_ident: Ident,
    pub props: Vec<NamedProp>,
    generics: Generics,
}

impl FluvioStruct {
    pub fn from_ast(item: &ItemStruct) -> syn::Result<Self> {
        let struct_ident = item.ident.clone();
        let generics = item.generics.clone();

        let fluvio_struct = match &item.fields {
            Fields::Named(fields) => {
                let mut props = vec![];
                for field in fields.named.iter() {
                    props.push(NamedProp::from_ast(field)?);
                }

                FluvioStruct::Named(FluvioNamedStruct {
                    struct_ident,
                    props,
                    generics,
                })
            }
            Fields::Unnamed(fields) => {
                let mut props = vec![];
                for field in fields.unnamed.iter() {
                    props.push(UnnamedProp::from_ast(field)?);
                }
                FluvioStruct::Tuple(FluvioTupleStruct {
                    struct_ident,
                    props,
                    generics,
                })
            }

            Fields::Unit => FluvioStruct::Tuple(FluvioTupleStruct {
                struct_ident,
                props: vec![],
                generics,
            }),
        };

        Ok(fluvio_struct)
    }

    pub fn struct_ident(&self) -> &Ident {
        match self {
            FluvioStruct::Named(inner) => &inner.struct_ident,
            FluvioStruct::Tuple(inner) => &inner.struct_ident,
        }
    }

    pub fn generics(&self) -> &Generics {
        match self {
            FluvioStruct::Named(inner) => &inner.generics,
            FluvioStruct::Tuple(inner) => &inner.generics,
        }
    }

    pub fn props(&self) -> FluvioStructProps {
        match self {
            FluvioStruct::Named(inner) => FluvioStructProps::Named(inner.props.clone()),
            FluvioStruct::Tuple(inner) => FluvioStructProps::Unnamed(inner.props.clone()),
        }
    }
}

pub(crate) enum FluvioStructProps {
    Named(Vec<NamedProp>),
    Unnamed(Vec<UnnamedProp>),
}

pub(crate) struct FluvioTupleStruct {
    pub struct_ident: Ident,
    pub props: Vec<UnnamedProp>,
    pub generics: Generics,
}