dynamic-graphql-derive 0.10.2

Dynamic GraphQL schema macro
Documentation
use darling::FromAttributes;
use darling::ast::Fields;
use darling::ast::Style;
use proc_macro2::TokenStream;
use quote::ToTokens;
use quote::quote;
use syn::Generics;

use crate::args::SimpleObject;
use crate::args::simple_object::SimpleObjectAttrs;
use crate::utils::derive_types::BaseStruct;
use crate::utils::derive_types::UnitStruct;
use crate::utils::macros::*;
use crate::utils::register_attr::RegisterAttr;
use crate::utils::with_attributes::WithAttributes;
use crate::utils::with_doc::WithDoc;

#[derive(FromAttributes, Debug, Clone)]
#[darling(attributes(graphql))]
pub struct MutationRootAttrs {
    #[darling(default)]
    pub name: Option<String>,

    #[darling(default)]
    #[darling(rename = "get_type_name")]
    pub type_name: bool,

    #[darling(default, multiple)]
    #[darling(rename = "register")]
    pub registers: Vec<RegisterAttr>,
}

from_derive_input!(
    MutationRoot,
    WithAttributes<WithDoc<MutationRootAttrs>, UnitStruct>,
    ctx,
);

impl From<MutationRoot> for SimpleObject {
    fn from(value: MutationRoot) -> Self {
        let name = value.0.attrs.inner.name;
        let type_name = value.0.attrs.inner.type_name;
        let doc = value.0.attrs.doc;
        let ident = value.0.inner.ident;
        let registers = value.0.attrs.inner.registers;

        SimpleObject(WithAttributes {
            attrs: WithDoc {
                doc,
                inner: SimpleObjectAttrs {
                    root: false,
                    mutation_root: true,
                    name,
                    type_name,
                    rename_fields: None,
                    registers,
                    marks: vec![],
                    impls: vec![],
                },
            },
            inner: BaseStruct {
                ident,
                generics: Generics::default(),
                data: Fields::new(Style::Unit, vec![]),
            },
        })
    }
}

impl ToTokens for MutationRoot {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        let simple_object = SimpleObject::from(self.clone());
        let simple_object_code = simple_object.to_token_stream();
        tokens.extend(quote! {
            #simple_object_code
        })
    }
}