dynamic-graphql-derive 0.10.2

Dynamic GraphQL schema macro
Documentation
use std::ops::Deref;

use crate::utils::impl_block::FromImplItemFn;
use crate::utils::impl_block::FromTraitItemFn;
use crate::utils::with_context::SetContext;
use crate::utils::with_index::SetIndex;

#[derive(Debug, Clone)]
pub struct Methods<Method> {
    pub methods: Vec<Method>,
}

impl<Method> Deref for Methods<Method> {
    type Target = Vec<Method>;

    fn deref(&self) -> &Self::Target {
        &self.methods
    }
}

impl<Method: SetContext> SetContext for Methods<Method> {
    type Context = Method::Context;

    fn set_context(&mut self, context: Self::Context) {
        self.methods.set_context(context);
    }
}

impl<Method: FromImplItemFn + SetIndex> Methods<Method> {
    pub fn from_impl_item_methods<'a>(
        items: &mut impl Iterator<Item = &'a mut syn::ImplItem>,
    ) -> darling::Result<Self> {
        Ok(Self {
            methods: items
                .enumerate()
                .filter_map(|(index, item)| match item {
                    syn::ImplItem::Fn(method) => {
                        Some(Method::from_impl_item_method(method).with_index(index))
                    }
                    _ => None,
                })
                .collect::<darling::Result<Vec<_>>>()?,
        })
    }
}

impl<Method: FromTraitItemFn + SetIndex> Methods<Method> {
    pub fn from_trait_item_methods<'a>(
        items: &mut impl Iterator<Item = &'a mut syn::TraitItem>,
    ) -> darling::Result<Self> {
        Ok(Self {
            methods: items
                .enumerate()
                .filter_map(|(index, item)| match item {
                    syn::TraitItem::Fn(method) => {
                        Some(Method::from_trait_item_method(method).with_index(index))
                    }
                    _ => None,
                })
                .collect::<darling::Result<Vec<_>>>()?,
        })
    }
}