captcha_oxide_derive 5.0.0

Useful proc macros for captcha_oxide
Documentation
use syn::Type;

use crate::expansion::derive_captcha_task::FieldAttr;

pub struct ClassifiedFields {
    pub required: Vec<FieldAttr>,
    pub optional: Vec<FieldAttr>,
}

fn is_required(x: &&FieldAttr) -> bool {
    match x.field.ty.clone() {
        Type::Path(ref ty) => ty.path.segments.first().unwrap().ident != "Option",
        _ => true,
    }
}

pub fn classify_fields(fields: Vec<FieldAttr>) -> ClassifiedFields {
    let required = fields.iter().filter(is_required).cloned().collect();
    let optional = fields.iter().filter(|x| !is_required(x)).cloned().collect();

    ClassifiedFields { required, optional }
}