sword-macros 0.3.0

Structured web framework built on top of tokio ecosystem, providing powerful features for building robust web applications.
Documentation
use proc_macro::TokenStream;
use syn::{Ident, ItemStruct, Type};

use super::{ControllerArgs, ParsedControllerKind};
use crate::{interceptor::InterceptorArgs, shared::StructFields};

pub struct ControllerStruct {
    pub name: Ident,
    pub kind: ParsedControllerKind,
    pub fields: Vec<(Ident, Type)>,
    pub interceptors: Vec<InterceptorArgs>,
}

impl ControllerStruct {
    pub fn parse(attr: TokenStream, item: TokenStream) -> syn::Result<Self> {
        let input = syn::parse::<ItemStruct>(item)?;
        let fields = StructFields::parse(&input)?;

        let controller_args = syn::parse::<ControllerArgs>(attr)?;
        let kind = ParsedControllerKind::try_from(controller_args)?;

        let mut interceptors = Vec::new();

        for attr in &input.attrs {
            if attr.path().is_ident("interceptor") {
                interceptors.push(attr.parse_args::<InterceptorArgs>()?);
            }
        }

        Ok(Self {
            name: input.ident,
            kind,
            fields,
            interceptors,
        })
    }
}